繁体   English   中英

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

[英]Try/Catch Wrap Around Task.Run not Handling Exception

我一直在学习使用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);
    }
}

这是错误的图片:

在此输入图像描述

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

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

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

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

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

正如Stephen的正确答案中所提到的,只有在Debugger打开时才会发生这种情况。 使用这个简单的解决方法,您可以重新抛出Task.Run()之外的异常;

Exception exceptionOut = null;

await Task.Run(() =>
{
    try
    {
        // Your code
    }
    catch (Exception exceptionIn)
    {
        exceptionOut = exceptionIn;
    }
});

if (exceptionOut != null)
    throw exceptionOut;

您的try / catch运行异步操作,因此不保持异步操作,因为在命中异常时不保证代码位于该位置。 尝试在Task.Run(() => {..});包含try / catch Task.Run(() => {..});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM