在 .Net 框架中,是否有触发异常的事件?每当捕获到异常时,我需要记录它。因此,如果存在事件,我可以订阅该事件并在事件处理程序中记录异常。
是的——UnhandledException事件存在于AppDomain对象上:
AppDomain.CurrentDomain.UnhandledException += YourHandler
请注意:仅在万不得已的情况下使用这些处理程序,最好在 try
catch
块中捕获异常,尽管这可能并不总是可行(例如,在第三方代码启动新线程时)。
此外,只有当异常未被处理时,才会触发此事件 - 据我所知,没有办法在没有将调试器附加到进程的情况下通知已捕获的事件。
[Serializable]
public class LogAttribute : OnMethodInvocationAspect
{
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
try
{
eventArgs.Proceed();
}
catch(Exception ex)
{
// log exception here
}
}
}
并将其应用到您的程序集中:
[assembly: Log]
public class ...
这并非人人都能胜任,但我发现这是一种非常干净、整洁的方式,可以避免在我的类中编写大量样板代码,并使我有更多时间专注于与项目本身相关的功能。
更新:正如Kugel在评论中指出的那样,这将帮助您跟踪和记录在执行方法期间抛出的任何异常,但如果您想记录方法内部的状态,您需要做更多的工作。
例如,您可能仍然需要在方法内部使用try / catch块,以捕获对您的类有用的异常,甚至可以将它们包装在自定义异常对象中,以便您可以开始添加更多有用的信息,如错误代码等。只要您的自定义异常具有适当的设置“Message”属性的机制,例如:
public class DictionaryKeyNotValidException() : Exception
{
public DictionaryKeyNotValidException(string key)
: base(GetMessage(key))
{
}
public ErrorEnum ErrorCode { get { return ErrorEnum.InvalidDictionaryKey; } }
private string GetMessage(string key)
{
return string.Format("ERROR {0} : Invalid dictionary key encountered {1}",
ErrorCode.GetHashCode(), key);
}
}
如果您正在使用Log4Net,那么在您的日志属性中,您可以开始记录更有用的信息:
catch (Exception ex)
{
// log error
log.Error(ex);
// handle exception, rethrow, etc.
...
}
throw;
。 - Dan BryantException
之外?我会在catch
块中调用我的日志模块。类似于这样:catch(YourException ex)
{
LogMyException(ex, [otherParamsYouNeed]);
//Other Exception Handling
}
如果您想记录某个操作的状态,无论成功或失败,都可以使用 finally{}
。
Application.ThreadException
事件,更一般的是AppDomain.CurrentDomain.UnhandledException
事件。 Exception ex = HttpContext.Current.Server.GetLastError();
看看这个http://www.switchonthecode.com/tutorials/csharp-tutorial-dealing-with-unhandled-exceptions,UnhandledExceptionEventHandler是你要找的,这是针对Windows的,但我认为Web也有类似的东西。
最好的祝福,
Iordan
在theburningmonk的回答基础上,您还可以尝试使用log4PostSharp。这是预先构建的代码,使用PostSharp插入与log4net日志框架配合工作的日志记录代码。
除其他事项外,这将自动向您的方法添加捕获异常并记录它们的代码。
所有这些都取决于您是否愿意使用log4net日志框架或者您更喜欢自己实现。
ObjectDisposedException
,检查它们的Message
并在不符合条件时使用throw;
重新抛出异常,从而实现类似的功能。不确定它在性能上如何比较,但毕竟它是一个异常,谁会在意呢? - Steven Sudit