尝试/捕获包裹Task.Run不处理异常

Sea*_*poe 4 .net c# try-catch task task-parallel-library

我一直在学习使用TPL,并且我从本文收集的一个例子中遇到了问题.我完全按照Task.Run示例中的方式复制并粘贴代码,但收到一条错误消息,指出未处理异常:

private async void button1_Click(object sender, EventArgs e)
{
    try
    {
        await Task.Run(() =>
        {
            Thread.Sleep(1000);
            throw new InvalidOperationException("Hi!");
        });
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是错误的图片:

在此输入图像描述

这个代码示例是否过时或者我遗漏了什么?

Ste*_*ary 5

这只是一个误导性的调试器消息.

实际发生的是异常被抛出,然后由.NET框架(不是用户代码)捕获,然后放在任务上.

因此,虽然从技术上讲,错误消息是正确的(它被.NET框架捕获 - 未被用户代码处理),但在这种情况下它并不是很有用.

不幸的是,调试器也没有很多替代品.在异常离开用户代码时,调试器无法"展望未来"以了解异常将放在特定任务上,并且您的代码将执行await该任务.它必须立即决定是否通知您,而不知道是否将await编辑该任务.