在阅读this MSDN页面后,我在我的.net类库中创建了一个全局异常处理程序,用于记录目的,如下所示:
static void OnException(object sender, UnhandledExceptionEventArgs args)
{
Exception ex = (Exception)args.ExceptionObject;
Logging.LogException(ex);
}
但是如果我从某个方法中throw new UnauthorizedAccessException()
或throw new Exception()
,那么根本无法捕捉到它。
MSDN页面说:
UnhandledExceptionEventArgs提供对异常对象的访问 以及表示公共语言运行时是否为的标志 终止。 UnhandledExceptionEventArgs是其中一个参数 传入UnhandledExceptionEventHandler for AppDomain.UnhandledException 事件
我相信我所做的事情属于AppDomain(而不是 ThreadException )?我在这里做错了什么?
PS。我试图避免try-catch
阻止,因为显然是it's bad practice。这个类库是从一个定期运行的Windows服务调用的,所以我不要让它崩溃'避免因意外异常导致的内存泄漏,并希望定期监视事件日志。
答案 0 :(得分:1)
您需要在当前应用程序域中安装异常处理程序才能触发:
AppDomain.CurrentDomain.UnhandledException += OnException;
否则它只是一个永远不会被调用的方法声明。
答案 1 :(得分:0)
你提到你试图避免尝试捕获,但在你的处理程序中,这不是一个坏主意:
static void OnException(object sender, UnhandledExceptionEventArgs args)
{
try
{
Exception ex = (Exception)args.ExceptionObject;
Logging.LogException(ex);
}
catch
{
// do nothing to silently swallow error, or try something else...
}
}
...因为您不想在错误处理程序中爆炸。如果稳定性是最重要的,要么吞下,要么尝试使用二级(更基本的)测井方法来确保没有异常通过裂缝。
通常,静默吞咽异常是一种不好的做法,但这是在错误处理块中,其中失败意味着崩溃应用程序。