问题:我想为控制台应用程序中未处理的异常定义一个全局异常处理程序。
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);
但是,如何为控制台应用程序定义全局异常处理程序?
CurrentDomain似乎不起作用(.NET 2.0)?
Edit:
grh,愚蠢的错误。
In VB.NET, one needs to add the “AddHandler” keyword in front of currentDomain, or else one doesn’t see the UnhandledException event in IntelliSense…
这是因为VB.NET和C#编译器对事件处理的处理方式不同。
答案
不,那是正确的方法。这可以完全按照应有的方式工作,也许可以从中工作:
using System;
class Program {
static void Main(string[] args) {
System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
throw new Exception("Kaboom");
}
static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) {
Console.WriteLine(e.ExceptionObject.ToString());
Console.WriteLine("Press Enter to continue");
Console.ReadLine();
Environment.Exit(1);
}
}
请记住,您无法以这种方式捕获抖动产生的类型和文件加载异常。它们发生在您的main()方法开始运行之前。抓住这些需要延迟抖动,将风险代码移动到另一种方法中,然后应用[methodimploptions.noinlining)]属性。