一:控制台应用程序
通过为当前AppDomain添加 UnhandledException 事件处理程序。
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionEventHandler); static void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e) { …… }
二: WinForm窗体应用程序
未处理的异常将引发Application.ThreadException事件。
a) 如果异常发生在主线程中,默认行为是未经处理的异常不终止该应用程序。在这种情况下,不会引发 UnhandledException 事件。但可以在在挂钩 ThreadException 事件处理程序之前,使用应用程序配置文件或者使用 Application.SetUnhandledExceptionMode() 方法将模式设置为 UnhandledExceptionMode.ThrowException 来更改此默认行为。
b) 如果异常发生在其它线程中,将引发 UnhandledException 事件。
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException) static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { …… }
三: ASP.NET应用程序
要截获ASP.NET 的未捕获异常,我们需要为每个应用程序域安装事件钩子。这个过程需要分两步完成:
a) 首先创建一个实现IHttpModule接口的类
public class UnhandledExceptionModule : IHttpModule { …… static object _initLock = new object(); static bool _initialized = false; public void Init(HttpApplication context) { // Do this one time for each AppDomain. lock (_initLock) { if (!_initialized) { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); _initialized = true; } } } }
b) 第二步:修改web.config,在 system.web 段中加入
<httpModules> <add name="UnhandledExceptionModule" type="WebMonitor.UnhandledExceptionModule" /> </httpModules>