问题:我想为控制台应用程序中未处理的异常定义一个全局异常处理程序。

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)]属性。

来自: stackoverflow.com