一尘不染

控制台应用程序中的.NET全局异常处理程序

c#

问题:我想在控制台应用程序中为未处理的异常定义一个全局异常处理程序。在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#编译器对事件处理的处理不同。


阅读 877

收藏
2020-05-19

共1个答案

一尘不染

不,那是正确的方法。这完全可以正常工作,也许您可​​以从以下方面进行工作:

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)]属性应用于该方法。

2020-05-19