C# 如何在C中插入catch块以发送异常电子邮件/sms/事件日志#
我想知道发生的每一个异常情况。我想我需要在每个catch块中编写代码C# 如何在C中插入catch块以发送异常电子邮件/sms/事件日志#,c#,exception-handling,C#,Exception Handling,我想知道发生的每一个异常情况。我想我需要在每个catch块中编写代码 发送电子邮件 发送短信 将其写入日志文件 写入事件日志 等等 试一试{ //做点什么 }捕获(例外情况除外){ //给我寄去。。。 } 有没有简单的方法可以在不编写任何代码的情况下注入catch块 PS:在阅读答案的链接时,我看到了一些文章,我想为我的问题添加配额 应发布捕获的一般异常 日志记录使用什么并不重要——log4net、EIF、事件日志、TraceListener、文本文件等。真正重要的是:如果捕获到一般异常,请将
您可以将面向方面编程用于
然而,在我看来,如果您所做的只是收集信息和日志记录,那么在程序顶部使用一个错误处理程序是一个更好的选择。您将通过这种方式获得堆栈跟踪。您可以使用面向方面的编程 然而,在我看来,如果您所做的只是收集信息和日志记录,那么在程序顶部使用一个错误处理程序是一个更好的选择。您将通过这种方式获得堆栈跟踪。您可以使用,或者都是开源的,并且在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块的地方勤奋地发布日志信息。虽然获取每个异常的想法似乎很有趣,但可能有些过分 根据我的经验