【问题标题】:Send Email in Global Exception Handler?在全局异常处理程序中发送电子邮件?
【发布时间】:2012-02-29 01:55:06
【问题描述】:

我想将全局异常处理代码添加到 C# WPF 应用程序中,虽然这看起来很不礼貌(似乎没有其他人这样做),但我想向开发人员发送包含异常信息的电子邮件。我能想到的主要问题是,如果开发人员在部署软件后最终更改了他的电子邮件地址。也许发给部门的电子邮件(例如列表服务类型的电子邮件广播地址)会更合适?有没有人使用过这种方法,如果有,您有什么解决方案来确保有人收到异常生成的电子邮件?

这是最好的解决方案吗:

// in exception code (pseudocode)
try
  SendEmailToTheCoder();
catch
  on EmailAddressNotValid:
    try
      SendEmailToTheListServ()
    catch
      on EmailNotSent:  
        LogExceptionDataToLog("Bla");

...或者我的大脑又变成梨形了(我不知道那是什么意思,但它是英国人,所以它一定很有趣)

【问题讨论】:

  • 我个人更喜欢 http(s) 请求而不是电子邮件。但当然,这可能会遭受同样陈旧的 url 问题。只需确保您有可用的永久网址即可。
  • 读了nuclear semiotics之后就遇到这个问题很讽刺。

标签: c# wpf exception-handling email email-validation


【解决方案1】:

最好的办法是将消息传递的详细信息保留在应用程序之外。

例如,您可以将错误记录到文本文件或其他类型的日志中,然后让外部应用程序或 Windows 服务监控该日志并决定做什么——例如发送电子邮件或创建摘要当天的所有消息并通过电子邮件发送,或类似操作。

这样,您可以优化和修改发生这些错误时发生的情况,而无需更改程序代码。您还可以将该系统与其他仅将错误记录到文本文件的应用程序重用,这比连接到 SMTP 服务器和发送消息的错误概率更低。

【讨论】:

  • 这不仅更可重用,而且如果在异常报告期间发生网络异常,它回避了递归到异常处理程序的问题(并且异常报告通常是应用程序中测试最少的部分之一无论如何,所以它会以意想不到的方式失败)
  • 创建一个IExceptionLogger 定义bool Log(Exception)foreach logger in exceptionLoggers, if logger.Log(ex); break;。 MEF IExceptionLoggers
【解决方案2】:

我将创建一个通讯组,例如developer@yourcompany.com,并添加负责该通讯组程序部分的人员。如果一名开发人员离开公司,您的代码中无需更改任何内容,也无需先尝试一件事,然后再尝试另一件事。

更好的是,使用诸如log4net 之类的日志框架(nlog 也很流行);您可以将其配置为登录到不同的位置(xml、数据库、电子邮件等)。如果您确实登录到电子邮件,我总是将它发送到一个通讯组,即使该通讯组仅由一个成员组成。

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 2017-07-13
    • 1970-01-01
    • 2011-04-07
    • 2014-04-17
    • 2012-12-31
    • 2011-05-19
    • 2011-08-31
    • 2010-12-05
    相关资源
    最近更新 更多