这是处理异常的正确方法吗?

Is this correct way to handle an exception?

我和我的同事争论过 Task.Run 块中的异常处理。

例如,我有这个代码:

private static async Task MainAsync()
{
    try
    {
        await Task.Run(() => throw new Exception());
    }
    catch (Exception)
    {
        Console.WriteLine("oops");
    }
}

如果我 运行 此代码(在调试模式下),我将从 vs2019 获得有关未处理异常的消息。但是如果我按下继续按钮,应用程序将正常工作并且异常将得到处理。

这是从 Task.Run 捕获异常的正确方法吗?

通常,任务中的异常(class Task 的对象)放在任务上,即如果任务中的某些代码在该任务中抛出异常 - 它存储在 Exception 属性 在 Task class.

await 运算符自动“解包”异常并抛出。所以你的方法是完全正确的,但我认为堆栈跟踪可能会改变 - 所以你需要记住这一点。