如何在catch块中注入以在C#中发送异常电子邮件/短信/事件日志

时间:2011-01-16 10:36:32

标签: c# exception-handling

我希望在事情发生时了解每一个特殊情况。我想我需要在每个catch块中编写代码

  1. 发送电子邮件
  2. 发送短信
  3. 将其写入日志文件
  4. 编写事件日志 等

    尝试{       // 做一点事   } catch(Exception ex){      //把我发给我   }

  5. 有没有简单的方法可以在不编写任何代码的情况下注入catch块?

    PS:当我正在阅读答案的链接时,我发现了一些文章,我想在我的问题中添加配额。

    Exception Handling Best Practices in .NET

      

    应发布通用异常   用于记录的内容无关紧要 - log4net,EIF,事件日志,TraceListeners,文本文件等。真正重要的是:如果您捕获了一般的异常,请将其记录在某处。但只记录一次 - 通常代码是使用catch块来记录异常,然后最终得到一个巨大的日志,过多的重复信息是有用的。

4 个答案:

答案 0 :(得分:2)

您可以创建自己的异常类,记录异常消息和/或堆栈跟踪。我们使用log4net执行此操作并且它可以工作,但确实需要一致的实现。您只想在层或层边界执行此操作,因为在大多数情况下,如果您不知道如何处理异常,它应该只是冒出调用堆栈。

类似的东西:

[Serializable]
public class FooException : Exception
{
    // Logger configured for email, file, etc.
    static ILog _log = LogFactory.Create();

    public FooException(string message, Exception innerException)
        : base(message, innerException)
    {
        _log.Error(message, innerException);
    }

    // ...
}

public class FooDataAccess<T> : IFooRepository
{
    public T GetFoo()
    {
        // Consider creating general helper methods with 
        // Action, Func, parameters so that you only have
        // to code the try ... catch block once.
        try
        {              
            // all exceptions caught
        }
        catch (Exception e)
        {
            throw new FooException(Exceptions.GetFooException, e);
        }
    }     
}

答案 1 :(得分:1)

您可以使用PostSharp进行面向方面编程。

但是,如果你所做的只是收集信息和记录,那么在你的程序顶部有一个错误处理程序是一个更好的选择。你以这种方式获得堆栈跟踪。

答案 2 :(得分:1)

您可以使用Spring.netUnityMEF这些都是开源的,并且可以通过网络获得良好的文档和示例。但是如果你有这个问题,我个人更喜欢自己做或者使用闭包来处理这个问题。

对于异常处理,您可以使用Enterprise Library并查看Quick start,这样您应该只有一些配置和异常处理程序,学习简单配置并使用它(如果您有处理程序)不到10分钟(或最多一小时)。

答案 3 :(得分:0)

虽然获得每一个例外的想法似乎都很有趣,但它可能有点过分。

根据我的经验,我发现拥有一个运行时可配置的日志框架(例如log4net)可以很好地处理这个场景。

有很多好处。 我发现的最大好处是,如果您使用每类记录器,那么您可以在希望在类级别接收异常电子邮件时进行调整。

这意味着对于那些被认为已知且不重要的异常,您可以简单地更改配置以关闭(例如)针对该异常的电子邮件报告,但留下记录到磁盘上的文本文件。

由于所有这些选项都是在日志记录配置中设置的,因此负责监视它的操作团队可以更改配置,而无需更改应用程序代码。

使用一些日志记录框架,您甚至可以在应用程序仍在运行时进行此重新配置。

唯一的缺点是,无论你有什么捕获区,你都需要勤勉地记录日志信息。