在异步方法中捕获异常

本文关键字:捕获异常 异步方法 | 更新日期: 2024-12-05 21:25:59

我正在尝试更熟悉异步/等待编程和异常处理。

static void Main(string[] args)
{
   TestAsyncException();
}
private static async void TestAsyncException()
{
    try
    {
        var result = await Task.Factory.StartNew(() => DoSomething());
        //do something with the result
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}
private static int DoSomething()
{
    throw new Exception("Exception was thrown!");
}

我希望Exception得到优雅处理,但代码执行停止,我得到

.. 中发生了类型为"System.Exception"的异常,但未 在用户代码中处理。

但是当我继续执行代码时,Exception实际上被捕获(并且消息会显示给Console)。

我应该如何在不破坏代码执行的情况下捕获Exception

在异步方法中捕获异常

首先,处理您的异常。 我相信您看到代码停止执行并显示错误,因为您已经Break When Thrown异常。 检查您的异常窗口 ( Debug -> Windows -> Exception Settings )。

当您在async方法上使用返回类型的void时,您无法从该方法中获取任何类型的信息 - 即发即弃。 除非在特定情况下,否则这是不好的做法。 始终让您的异步方法返回TaskTask<T>

private static async Task TestAsyncException()

现在,您的主要方法可以侦听任务:

static void Main(string[] args)
{
    TestAsyncException().Wait(); // or whatever you want to do with the task
    Console.Read();
}

通常,您可以使用await在此处解包任务,但这在应用程序入口点中是不允许的。