在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
原文:http://www.cnblogs.com/kissazi2/p/3393151.html
毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里。所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命。下面我们主要讨论的是如何捕捉全局的异常。基本上在winform或web中捕获全局异常的思路都是一样的,在全局的应用程序对象中添加异常捕获的代码,并写入日志文件中。
一.在Winform程序中捕获全局异常
在winfrom中我们需要了解Application对象中的两个事件
①Application.ThreadException 事件--当UI线程中某个异常未被捕获时出现。
②AppDomain.UnhandledException 事件--当非UI线程中某个异常未被捕获时出现。
我们需要在Program.cs中设置异常的捕捉代码(如下图所示)。LogHelper类是自定义的日志帮助类,在前面的几篇文章中已经有涉及到。
需要在Program.cs中添加的代码如下所示
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Text; using Common; namespace testLog4N { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { BindExceptionHandler();//绑定程序中的异常处理 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } /// <summary> /// 绑定程序中的异常处理 /// </summary> private static void BindExceptionHandler() { //设置应用程序处理异常方式:ThreadException处理 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //处理UI线程异常 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //处理未捕获的异常 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); } /// <summary> /// 处理UI线程异常 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { LogHelper.ErrorLog(null, e.Exception as Exception); } /// <summary> /// 处理未捕获的异常 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { LogHelper.ErrorLog(null, e.ExceptionObject as Exception); } } }