【问题标题】:Is this correct way to handle an exception?这是处理异常的正确方法吗?
【发布时间】:2020-12-30 13:48:41
【问题描述】:

我和我的同事就在 Task.Run 块中处理异常发生了争执。

例如,我有这样的代码:

private static async Task MainAsync()
{
    try
    {
        await Task.Run(() => throw new Exception());
    }
    catch (Exception)
    {
        Console.WriteLine("oops");
    }
}

如果我运行此代码(在调试模式下),我将收到来自 vs2019 的有关未处理异常的消息。但是如果我按下继续按钮,应用程序将正常运行并处理异常。

从Task.Run捕获异常的正确方法吗?

【问题讨论】:

  • 这能回答你的问题吗? How to handle Task.Run Exception
  • 没关系。或者,将它们捕获在Task.Run 本身内(这样它们就不会冒泡)。取决于你真正想做什么。
  • 通常情况下,这取决于。在您的示例中,异常被吞没。 MainAsync 的调用者无法知道执行是否成功。在某些情况下,需要此信息,例如开始下一步。
  • @Arli Chokoev 你看到有提到 async/await 吗?这不是类似的情况!
  • I've argued with my colleague about handling exceptions in Task.Run blocks. 你的同事建议什么方法?感觉就像你展示了论点的一方面,但没有展示另一面......

标签: c# exception task-parallel-library


【解决方案1】:

通常,任务中的异常(Task 类的对象)被放置在任务上,即如果任务中的某些代码在该任务内引发异常 - 它存储在 Task 类的 Exception 属性中。

await 运算符自动“解包”异常并抛出。所以你的方式是完全正确的,但我认为堆栈跟踪可能会改变 - 所以你需要记住这一点。

【讨论】:

猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多