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

本文关键字:捕获异常 方法 async await 使用 | 更新日期: 2023-09-27 17:58:46

所有,请使用以下代码:

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...
    }
}

但在上面指定的一行,它表示重新抛出的异常是未处理的我在上面的第一个代码片段中用适当的try/catch包装我的await,为什么这个try/catch没有跟踪重新抛出的异常

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

以下是Microsoft Connect针对相同问题的支持请求。在中禁用"仅我的代码"

Tools->Options->Debugging>常规

解决了问题。