【问题标题】:Console application - try catch block doesn't work for Tasks控制台应用程序 - 尝试捕获块不适用于任务
【发布时间】:2014-03-22 12:45:12
【问题描述】:

这可能是一个基本问题,但是当我尝试捕获 Task(在控制台应用程序中)中引发的异常时,即使我在 try catch 块中调用 task.Wait(),应用程序也会因未处理的异常而中断(添加类似Thread.Sleep 投掷前没有帮助):

static void Main(string[] args)
{
    Task task = Task.Run(() => { throw null; });

    try
    {
        task.Wait();
    }
    catch (AggregateException ae)
    {
        if (ae.InnerException is NullReferenceException)
            Console.WriteLine("Null!");
        else
            Console.WriteLine("Exception!");
    }

    Console.ReadLine();
}

截图:

【问题讨论】:

  • 该代码对我来说运行良好。
  • 这对我有用。我得到空!在输出中。
  • 你可以点击Continue按钮,你会看到异常会被捕获。

标签: c# multithreading exception console-application


【解决方案1】:

如果您在 catch 中设置断点并继续执行,您将看到异常将被捕获。

【讨论】:

  • 但是为什么会出现错误窗口,这是主要问题。
  • @Chirag: 因为throw null 发生在没有catch 块的不同线程上。调试器无法预测您稍后会在主线程上捕获异常。
【解决方案2】:

如果您为您的任务await,那么您将获得例外。否则它将发生在另一个线程中。

【讨论】:

    【解决方案3】:

    此屏幕仅显示断点处发生的情况,如果您继续执行程序或将断点进一步向下移动,您将看到异常被捕获并按预期返回 Null 从调试器的角度来看,最简单的解释是——我看到了异常,那现在怎么办? ooo 这里是 catch 语句,让我们看看如何处理它

    【讨论】:

      【解决方案4】:

      取消选中此行Break when this exception type is user-unhandled 并点击继续。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-20
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多