【问题标题】:Async/await throwing unhandled exception异步/等待抛出未处理的异常
【发布时间】:2017-06-08 11:41:51
【问题描述】:

我正在尝试从任务中实现异常处理,但我似乎无法正确处理。我找到了一些该模式的示例,但无论我尝试什么,我似乎总是从任务本身中获得未处理的异常。我一定错过了什么,但我看不到什么。任何帮助将不胜感激。

我尝试了一个在 MSDN 上找到的示例,但这对我不起作用:

https://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx

我遵循了这个问题的答案,但是当我在 Visual Studio 中运行修复程序时,它仍然抱怨未处理的异常:

ContinueWith TaskContinuationOptions.OnlyOnFaulted does not seem to catch an exception thrown from a started task

这是我最初写的代码:

static void Main(string[] args)
{
    TestAsync().ContinueWith(t =>
    {
        Console.WriteLine(t.Exception.ToString());
    }, TaskContinuationOptions.OnlyOnFaulted);

    Console.ReadKey();
}

static async Task<IEnumerable<string>> TestAsync()
{
    IEnumerable<string> list = null;

    try
    {
        list = await TestTask();
    }
    catch (Exception)
    {
        Console.WriteLine("Caught!");
    }


    return list;
}

static Task<IEnumerable<string>> TestTask()
{
    var task = new Task<IEnumerable<string>>(() =>
    {
        throw new AggregateException("This is a test");
    });

    task.Start();

    return task;
}

【问题讨论】:

  • 我不完全清楚 - 你期望发生什么?我所看到的只是一个投掷、接球和重新投掷的路径。这将使异常未处理。
  • 感谢您的回答。我希望 TestTask() 中引发的异常最终会出现在它返回的任务的 Exception 属性中,但是当我在 Visual Studio 中运行此示例时,它会突出显示 TestTask() 中的 throw 并说这是一个未处理的异常。我也很惊讶 MSDN 上的示例做了同样的事情。
  • 我已经更新了示例代码,因此它显示了我想要做的更多。

标签: c# .net asynchronous async-await task


【解决方案1】:

在 VS 中断后点击继续,您会看到它到达您的 ContinueWith。这只是调试器的一个怪癖,因为它无法在处理执行的代码中找到 try/catch。

如果您不希望调试器停止并向您显示一条消息,则需要在调试器选项中禁用“仅我的代码”,以便 Task 内部的 try/catch 被计为事物捕获异常。

【讨论】:

  • 哇——真的就是这样吗?我确实注意到,如果我在异常之后继续,它会到达我的 ContinueWith,但我担心如果代码在发布中执行,那么它会到达未处理的异常,而不是进一步。
  • 感谢您的帮助。我已经在发布模式下测试了上面的代码,它按预期工作。在开发较大的应用程序并需要处于调试模式时,我可能会觉得这有点麻烦,但我猜那是使用“仅我的代码”选项的时候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多