使用async/await正确地抛出和捕获异常的方法

3
各位,请使用以下代码:

```

Task<bool> generateStageAsyncTask = null;
generateStageAsyncTask = Task.Factory.StartNew<bool>(() =>
{
    return GenerateStage(ref workbook);
}, this.token,
   TaskCreationOptions.LongRunning,
   TaskScheduler.Default);

// Run core asynchroniously.
bool bGenerationSuccess = false;
try
{
    bGenerationSuccess = await generateStageAsyncTask;
}
catch (OperationCancelledException e)
{
    // Script cancellation.
    result.RunSucceeded = true;
    result.ResultInfo = "Script processing cancelled at the users request.";
    return result;
}

在方法GenerateStage内部,我按以下方式测试并重新抛出OperationCancelledException

try
{
    ...
}
catch (Exception e)
{
    if (e.GetType() == typeof(OperationCanceledException))
        throw e;
    else // <- Here it is saying that the thrown exception is unhandled.
    {
        // Do other stuff...
    }
}

但是在上述指定的行中,它表明重新抛出的异常未经处理。我将第一个代码片段中的await用适当的try/catch包装起来,为什么这个try/catch没有捕获重新抛出的异常呢?


6
为什么您没有使用catch(OperationCanceledException) - Peter Ritchie
result是什么,它在哪里定义的,在哪里赋值的? - Peter Ritchie
你是否正在使用 CancelationTokenSource 取消操作,该操作来自于 token - Peter Ritchie
对于关闭投票,这个问题为什么是“不是一个真正的问题”?这里所问的很明显。我在等待周围使用的Try/Catch没有捕获重新抛出的异常 - 为什么? - MoonKnight
@svick感谢您建议不要使用throw e; - MoonKnight
显示剩余4条评论
1个回答

2
这里有一个与此问题相关的Microsoft Connect支持请求。在

工具->选项->调试->常规

中禁用“仅限我的代码”即可解决该问题。


并介绍另一篇,可以参考这篇文章:VS2010对使用“只调试我的代码”功能的影响,此文是在了解了与 JMC 相关的Step Into“调试体验”之后的。基本上,在某些情况下,“逐步执行”功能无法按预期工作。 - Victor Zakharov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接