【问题标题】:Stop Visual Studio from breaking on exception in Tasks阻止 Visual Studio 中断任务中的异常
【发布时间】:2013-05-31 02:15:26
【问题描述】:

我有以下代码:

Task load = Task.Factory.StartNew(() => {//Some Stuff Which Throws an Exception});

try
{
    load.Wait();
}
catch (AggregateException ex)
{
    MessageBox.Show("Error!");
}

每当在 Task 中抛出异常时,我希望它冒泡并在 try catch 中被捕获,而不是 Visual Studio 在异常发生时中断。

我尝试了谷歌,有人建议我在我的方法之上添加这个[DebuggerHidden],但它不起作用。

【问题讨论】:

  • 哦,伙计,这让我很困惑。我认为我的异常根本没有被捕获,而是自动中断还为时过早,可以继续。真的似乎是一个非常糟糕的默认行为。错误消息似乎明显错误,因为它声称异常未被捕获,但继续将导致它被完美捕获。

标签: c# visual-studio-2010 debugging visual-studio-debugging


【解决方案1】:

好的,我知道该怎么做。答案是正确的here在注释部分

启用“仅我的代码”后,Visual Studio 在某些情况下会中断引发异常的行并显示一条错误消息,指出“用户代码未处理异常”。这个错误是良性的。您可以按 F5 继续并查看这些示例中演示的异常处理行为。 要防止 Visual Studio 在出现第一个错误时中断,只需取消选中“工具”、“选项”、“调试”、“常规”下的“仅启用我的代码”复选框。

【讨论】:

    【解决方案2】:

    从 VS 的角度来看,从传递给 Task 的委托中抛出的异常与任何其他异常之间确实没有任何区别。

    一般情况下没有办法解决这个问题。

    但是,您可以做的一件事是利用这样一个事实,即当重新抛出异常时,它会被包裹在 AggregateException 中。当抛出 AggregateException 而不是其他异常时,您可能会中断。

    你可以去Debug -> Exceptions,取消选择所有CLR异常,然后重新启用聚合异常:

    它现在不会在 Task 正文中暂停,但会在您调用 Wait 时暂停调试器。

    不幸的副作用是,您现在将不再为程序中其他任何地方的任何其他异常暂停,即使它们不在传递给 Task 的委托中。

    【讨论】:

      【解决方案3】:

      要关闭异常停止,请按“Ctrl + Alt + E”。这将打开例外窗口。取消勾选“公共语言运行时异常 - 抛出”。

      【讨论】:

      • 这将阻止它在代理内部暂停,但在Wait 重新抛出时不会。
      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2019-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多