.IO. StreamWriter(fs, System.Text.Encoding.UTF8)) { w.WriteLine(e.ExceptionObject); } } } catch { } }
现在我们就可以截获未捕获异常了 下面是完整的测试代码:
public class TestRaiseException { ~TestRaiseException() { int i = 0; int j = 1 / i; } }
static void UnhandledExceptionEventHandler(object sender, U nhandledExceptionEventArgs e) { try {
using (System.IO.FileStream fs = new System.IO.File Stream(@"c:\testme.log", System.IO.FileMode.Append, System.IO.FileAcces s.Write)) { using (System.IO.StreamWriter w = new System.IO. StreamWriter(fs, System.Text.Encoding.UTF8)) { w.WriteLine(e.ExceptionObject); } } } catch { } }
static void Main(string[] args) {
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(UnhandledExce ptionEventHandler);
TestRaiseException testRaiseException = new TestRaiseEx ception();
}
程序运行后记录下日志如下 System.DivideByZeroException: Attempted to divide by zero. at TestCosole.Program.TestRaiseException.Finalize()
? WinForm
WinForm 应用通过 Application.ThreadException 事件来截获未捕获异常 详见 园子里面另一篇博客,这里就不再冗诉。 体面地处理程序的未捕获异常
体面地处理程序的未捕获异常
经常有客户抱怨程序遇到错误的时候程序就退出了,甚至来不及保存窗体的输入数据,如果是普通的
搜索界 面也就罢了,但如果客户是呼叫中心,问题就严重了.按道理,我们的程序员应该处理所有的异常,但有事实上 做到的很难,因为出乎意料的情况太多了. 在这篇文章,我给大家介绍一下我的处理方法。 首先介绍相应的 C#相关知识: System.Windows.Forms.Application 类 提供 static 方法和属性以管理应用程序,例如启动和停止应用
程序、处理 Windows 消息的方法和
获取应用程序信息的属性。
System.Windows.Forms.Application.ThreadException 事件 在发生未捕获线程异常时发生。
System.Windows.Forms.Application.SetUnhandledExceptionMode()方法 方法 指示应用程序如何响应未处理的异常。
? SetUnhandledExceptionMode(UnhandledExceptionMode)
指示应用程序如何响应未处理的异常。
? SetUnhandledExceptionMode(UnhandledExceptionMode, Boolean)
指示应用程序如何响应未处理的异常,同时可选择应用特定于线程的行为。
System.Windows.Forms.UnhandledExceptionMode 枚举 定义 Windows 窗体应用程序应在何处发送未处理的异常。 public enum UnhandledExceptionMode { Automatic, 指定了其他位置。 ThrowException, //从不将异常传送到 ThreadException 处理程序。忽略应用程序配置文件。 //将所有异常都传送到 ThreadException 处理程序,除非应用程序的配置文件
CatchException
//始终将异常传送到 ThreadException 处理程序 忽略应用程序配置文件 。 。
}
以下是我的实现示例: ///
/// 应用程序的主入口点。 /// [STAThread] static void Main() {
//应用程序的主入口点添加 ThreadException 的事件处理。 Application.ThreadException += new ThreadExceptionEventHandler(Application_Thread Exception);
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { //作为示例,这里用消息框显示异常的信息 MessageBox.Show(e.Exception.Message,"异常",MessageBoxButtons.OK,MessageBoxIcon.
Error); }
?
Asp.net
ASP.NET 应用和前两种应用有所不同,ASP.NET 一般在后台线程或者线程池中产生未捕获异常, 才会导致 W3WP.exe 终止,并在事件查看器中产生一条类似下面内容的事件:EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.1830, P3 42435be1, P4 app_w