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

C# 如何在C中插入catch块以发送异常电子邮件/sms/事件日志#,c#,exception-handling,C#,Exception Handling,我想知道发生的每一个异常情况。我想我需要在每个catch块中编写代码 发送电子邮件 发送短信 将其写入日志文件 写入事件日志 等等 试一试{ //做点什么 }捕获(例外情况除外){ //给我寄去。。。 } 有没有简单的方法可以在不编写任何代码的情况下注入catch块 PS:在阅读答案的链接时,我看到了一些文章,我想为我的问题添加配额 应发布捕获的一般异常 日志记录使用什么并不重要——log4net、EIF、事件日志、TraceListener、文本文件等。真正重要的是:如果捕获到一般异常,请将

我想知道发生的每一个异常情况。我想我需要在每个catch块中编写代码

  • 发送电子邮件
  • 发送短信
  • 将其写入日志文件
  • 写入事件日志 等等

    试一试{ //做点什么 }捕获(例外情况除外){ //给我寄去。。。 }

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

    PS:在阅读答案的链接时,我看到了一些文章,我想为我的问题添加配额

    应发布捕获的一般异常 日志记录使用什么并不重要——log4net、EIF、事件日志、TraceListener、文本文件等。真正重要的是:如果捕获到一般异常,请将其记录到某个地方。但是只记录一次——通常代码中充斥着记录异常的catch块,最终会产生一个巨大的日志,重复的信息太多,没有用处


    您可以将面向方面编程用于


    然而,在我看来,如果您所做的只是收集信息和日志记录,那么在程序顶部使用一个错误处理程序是一个更好的选择。您将通过这种方式获得堆栈跟踪。

    您可以使用面向方面的编程

    然而,在我看来,如果您所做的只是收集信息和日志记录,那么在程序顶部使用一个错误处理程序是一个更好的选择。您将通过这种方式获得堆栈跟踪。

    您可以使用,或者都是开源的,并且在web上有很好的文档和示例。但是如果你有这个问题,我个人更喜欢自己做或者用闭包来处理

    对于异常处理,您可以使用,也可以查看,这样您就只需要一些配置和您的异常处理程序,学习简单的配置并使用它(如果您有处理程序)只需不到10分钟(或最多一个小时)。

    您可以使用,或者它们都是开源的,并且在web上有很好的文档和示例。但是如果你有这个问题,我个人更喜欢自己做或者用闭包来处理


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

    您可以创建自己的异常类来记录异常消息和/或堆栈跟踪。我们使用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);
            }
        }     
    }
    
    [可序列化]
    公共类异常:异常
    {
    //为电子邮件、文件等配置的记录器。
    静态ILog_log=LogFactory.Create();
    公共FooException(字符串消息,异常innerException)
    :base(消息,内部异常)
    {
    _日志错误(消息,innerException);
    }
    // ...
    }
    公共类FooDataAccess:IFooRepository
    {
    公共T GetFoo()
    {
    /考虑创建通用助手方法
    //操作、Func、参数,这样您就只有
    //对try…catch块编码一次。
    尝试
    {              
    //捕获所有异常
    }
    捕获(例外e)
    {
    抛出新的FooException(Exceptions.GetFooException,e);
    }
    }     
    }
    
    您可以创建自己的异常类,用于记录异常消息和/或堆栈跟踪。我们使用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);
            }
        }     
    }
    
    [可序列化]
    公共类异常:异常
    {
    //为电子邮件、文件等配置的记录器。
    静态ILog_log=LogFactory.Create();
    公共FooException(字符串消息,异常innerException)
    :base(消息,内部异常)
    {
    _日志错误(消息,innerException);
    }
    // ...
    }
    公共类FooDataAccess:IFooRepository
    {
    公共T GetFoo()
    {
    /考虑创建通用助手方法
    //操作、Func、参数,这样您就只有
    //对try…catch块编码一次。
    尝试
    {              
    //捕获所有异常
    }
    捕获(例外e)
    {
    抛出新的FooException(Exceptions.GetFooException,e);
    }
    }     
    }
    
    虽然获取每一个异常的想法似乎很有趣,但可能有点过头了

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

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

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

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

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


    唯一不好的一面是,您需要在有catch块的地方勤奋地发布日志信息。

    虽然获取每个异常的想法似乎很有趣,但可能有些过分

    根据我的经验