有没有办法在 C# 中继续异常?

Posted

技术标签:

【中文标题】有没有办法在 C# 中继续异常?【英文标题】:is there a way to continue an exception in C#? 【发布时间】:2009-12-16 09:26:06 【问题描述】:

当您的程序(在调试器中)发生意外异常时。有时您只想跳过它,因为此时终止程序比继续更有害。或者您只是想继续,因为您对另一个错误/错误更感兴趣

是否有选项/compilerflag/secretswitch 来启用此功能?

我知道异常应该立即解决,但在某些情况下(就像我描述的那样),人们只想暂时跳过它

【问题讨论】:

【参考方案1】:

如果您的代码中没有适当的 catch 块,您将无法执行此操作,不。但是,我不记得曾经想要这样做:如果发生您的代码不知道如何真正处理的异常,您为什么要继续?那时你的状态很糟糕——继续下去会很危险。

您能否举例说明为什么要在调试器会话中继续,而不是在生产代码中?

【讨论】:

我也偶然发现了这一点 - 如果第一个异常对于您实际调试的问题并不重要,您可能需要继续。在这种情况下,您可以将状态重置为异常之前的状态,然后跳过引发异常的步骤。使用 VS 2010 中的时间调试,这可能会变得更容易 :) 但是,总的来说,您是对的,无论如何,您迟早必须处理第一个异常。 @jon: 非常正确....但是我遇到了这个仅在生产环境中发生的错误。所以我连接了调试器......是的,有未捕获的异常。它甚至不是什么大不了的事,所以我宁愿先让这件事正确地完成它的工作,然后彻底停止程序修复异常并将其恢复。 @oregon: 是的......调试器捕获它的事实......表明程序仍然在那里漂浮......并且可以让它继续。 (就像 asserts 有这个选项一样) @reinier:断言不返回任何东西,也不应该有副作用 - 而假设异常是由返回值的方法引发的。该方法不愿意返回该值,因为它检测到状态无效......调用方法应该得到什么?停止程序并修复它几乎总是比在处于错误状态时尝试继续更好。 @jon:我同意这可能很麻烦。 ;^) 我会以此为答案:不,这不能完成。【参考方案2】:

C# 中的异常是不可恢复的,但事件是 - 这就是可恢复异常的典型实现方式:如 cancellable events。另见this question。

【讨论】:

【参考方案3】:

使用 try-catch 块,并且在捕获时,不要对异常做任何事情。

【讨论】:

那行不通。没有 catch 或 finally 的 try 是无效的,当发生异常时,不执行任何操作的 try/catch 块将不会在 try 【参考方案4】:

如果您进入调试器,则右键单击要继续的行并选择:设置下一条语句...但使用它需要您自担风险!

【讨论】:

如果异常已经发生并且我被扔进调试器,这是否有效? 不,如果您从调试器启动应用程序,如果它来自 JIT,那么这是不可能的。【参考方案5】:

在调试模式下单步执行代码时,您可以跳过引发意外异常的指令的执行。但是如果异常已经被抛出并且你没有 try/catch 它将传播。

【讨论】:

【参考方案6】:

查看Exception Handling Application Block 和相关文档。它包含处理应用程序异常的最佳实践,并为您完成了许多框架代码,即日志记录。

【讨论】:

【参考方案7】:

如果您想知道要允许什么异常。那么你可以在下面这样做

try

       // your functionality

catch(Exception ex)

     // Catch only the exceptions you need to point out

finally

   //do what you want to complete with this function.

【讨论】:

是的,我知道如何捕获异常。我的问题是关于那个被抛出但我忘记捕获并且调试器捕获它的异常......我想继续但我不能 你能告诉我调试器显示了什么异常,以及你的代码的哪一部分代码 @solairaja:这是一个假设性问题。在抛出异常之前发生在我身上,我周围没有 try/catch 块,并且调试器启动了。那时我想继续执行代码但不能。这是我的问题:是否可以在不首先修复代码并添加 try/catch 块的情况下继续恢复 如果没有 FIXING Code 或 Try Catch Block,我们无法排除调试器引发的错误。由于它的假设性问题,如果我们知道错误,我们不知道确切的错误,那么我们可以排除(仍然只是一种修复)。所以最终的答案是“你不能继续例外” @solairaja:非常感谢!【参考方案8】:

我假设“跳过”是指您希望程序在异常发生后继续工作。 当然,这可以通过在使用 try-catch 块时捕获异常来实现。

如果异常不是应用程序停止器(例如,某些关键变量在异常后没有初始化,您无法继续工作),建议您至少在继续之前记录它。当然,把

捕获(异常 e)

源代码中的任何地方都不会导致稳定的应用程序;)

如果您的问题更多地与调试器相关(您不希望调试器在每次抛出异常时都停止),那么 VS 中有一个地方可以更改:

调试菜单中,选择Exceptions。您将看到所有可能的异常,并且您可以调整它们在用户抛出或未处理时的行为。

【讨论】:

是的,我知道如何捕获异常。我的问题是关于那个被抛出但我忘记捕获并且调试器捕获它的异常......我想继续但我不能 您的意思是,您的生产环境中有应用程序,但您现在无权更改源。您想通过跳过该异常来使其工作吗?如果是这样的话,嗯。不确定您是否可以告诉虚拟机“不要抛出此异常”... danail: 异常已经被抛出并且调试器捕获了它......我现在唯一能做的就是查看一些变量,然后退出应用程序/调试器。我希望(如果出现一个无关紧要的愚蠢异常)能够让程序继续运行(从下一行/块开始)

以上是关于有没有办法在 C# 中继续异常?的主要内容,如果未能解决你的问题,请参考以下文章

进入 C# 调试器以除以零

芹菜 - 中间的子任务失败后有没有办法继续执行链

有没有办法只在 C# 中设置一次属性

有没有办法只在 C# 中设置一次属性

JetBrains Rider 不显示 C# WPF 异常

拦截 C# 中的所有异常,即使它们已经被捕获 [重复]