问:我想在我的控制台应用程序中为未处理的异常定义一个全局异常处理程序。在asp.net中,可以在global.asax中定义一个,在windows应用程序/服务中,可以定义如下
AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);
但是如何为控制台应用程序定义全局异常处理程序? currentDomain 似乎不起作用(.NET 2.0)?
编辑:
啊,愚蠢的错误。 在VB.NET中,需要在currentDomain前面加上“AddHandler”关键字,否则在IntelliSense中看不到UnhandledException事件…… 这是因为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() 方法开始运行之前。捕捉这些需要延迟抖动,将有风险的代码移动到另一个方法中并对其应用 [MethodImpl(MethodImplOptions.NoInlining)] 属性。