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

dddzy1tm  于 2023-06-25  发布在  .NET
关注(0)|答案(2)|浏览(151)

我将一个控制台应用程序移植到.NET Core,我试图替换以下行:

AppDomain.CurrentDomain.UnhandledException += UnhandledException;

在阅读this之后,似乎没有内置的方法来做到这一点。
所以我的问题是是用try/catch替换整个代码的唯一方法吗?
通过阅读this,似乎还有另一种方法,即继续使用System.AppDomain,但我似乎找不到这个类/方法。我唯一的猜测是this library,但它明确指出如果可能的话不应该使用它,所以我不想这样做。

pzfprimi

pzfprimi1#

你是对的,AppDomain.UnhandledException或它是模拟will be available only in .Net Core 2.0,所以现在你应该等待或添加额外的try/catch块。但是,如果您正在使用任务,则可以使用TaskScheduler.UnobservedTaskException,其中is available from first version.Net Core

6l7fqoea

6l7fqoea2#

这现在起作用了,所以对于任何希望在最新版本的.NET Core(例如.NET 6)中全局处理异常的人来说,这与旧的.NET Framework中使用的代码相同:

class Program {
    static void Main(string[] args) {
        System.AppDomain.CurrentDomain.UnhandledException += HandleGlobalException;
        throw new Exception("Fatal!");
    }

    static void HandleGlobalException(object sender, UnhandledExceptionEventArgs e) {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue...");
        Console.ReadLine();
        Environment.Exit(1);
    }
}

如果您的控制台应用程序使用top-level statements,也可以正常工作:

System.AppDomain.CurrentDomain.UnhandledException += HandleGlobalException;
throw new Exception("Fatal!");

static void HandleGlobalException(object sender, UnhandledExceptionEventArgs e) {
    Console.WriteLine(e.ExceptionObject.ToString());
    Console.WriteLine("Press Enter to continue...");
    Console.ReadLine();
    Environment.Exit(1);
}

相关问题