Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试捕获并重新抛出异常_C#_Exception_Try Catch_Rethrow - Fatal编程技术网

C# 尝试捕获并重新抛出异常

C# 尝试捕获并重新抛出异常,c#,exception,try-catch,rethrow,C#,Exception,Try Catch,Rethrow,前几天,我在我们的一个项目中看到一些代码,它们使用try-catch并重新抛出捕获的异常,如下所示: try { exceptionProneCode(); } catch(Exception ex) { throw ex; } 除了catch块中的异常之外,没有做任何其他操作,所以我甚至不知道为什么会重新抛出它。我看不出再次抛出相同的异常并对异常不做任何处理有什么好处 如果重新抛出在catch块中捕获的异常,C#如何处理?它是否陷入了无限抛接球循环?或者它最终会离开try c

前几天,我在我们的一个项目中看到一些代码,它们使用try-catch并重新抛出捕获的异常,如下所示:

try
{
    exceptionProneCode();
}
catch(Exception ex)
{
    throw ex;
}
除了catch块中的异常之外,没有做任何其他操作,所以我甚至不知道为什么会重新抛出它。我看不出再次抛出相同的异常并对异常不做任何处理有什么好处


如果重新抛出在catch块中捕获的异常,C#如何处理?它是否陷入了无限抛接球循环?或者它最终会离开try catch吗?

它会将异常抛出给调用方。但是它在这里处理它,所以它不会抛出未处理的异常。然而,老实说,我不认为这有什么好处。让它抛出异常。为什么?因为只有当异常上面的整个调用堆栈没有
try时,才会有异常未处理。。。捕捉
。这没有做任何有用的事情。

它向调用方抛出异常。但是它在这里处理它,所以它不会抛出未处理的异常。然而,老实说,我不认为这有什么好处。让它抛出异常。为什么?因为只有当异常上面的整个调用堆栈没有
try时,才会有异常未处理。。。捕捉
。这没有任何用处。

考虑以下两种模型:

1-通过重新执行以下操作:

catch(Exception ex)
{
    throw ex;
}
您松开了
StackTrace
。如果
异常
记录在某个地方,则包含调用堆栈立即帧(方法调用历史)的
堆栈跟踪
将丢失

2-与抛出的
相反:

catch(Exception ex)
{
    // do something here
    throw;
}

您可以维护
StackTrace
。您可以进行额外的处理,然后重新抛出
异常
,而不会丢失跟踪字符串。

考虑以下两种模型:

1-通过重新执行以下操作:

catch(Exception ex)
{
    throw ex;
}
您松开了
StackTrace
。如果
异常
记录在某个地方,则包含调用堆栈立即帧(方法调用历史)的
堆栈跟踪
将丢失

2-与抛出的
相反:

catch(Exception ex)
{
    // do something here
    throw;
}

您可以维护
StackTrace
。您可以执行附加处理,然后在不丢失跟踪字符串的情况下重新抛出
异常。

它会继续将异常抛出调用堆栈。这段代码所做的一件事与未捕获异常的情况不同,它会将异常位置(调用堆栈、行#等)重置为引发异常的位置,因此您将没有引发原始异常的位置


如果您不打算在catch块中实际执行某些操作,我建议您不要捕获,或者至少用一个
抛出
而不是
抛出ex
来重新抛出异常,它将继续抛出调用堆栈。这段代码所做的一件事与未捕获异常的情况不同,它会将异常位置(调用堆栈、行#等)重置为引发异常的位置,因此您将没有引发原始异常的位置

如果您不打算在catch块中实际执行某些操作,我建议您不要执行catch,或者至少只使用
throw
而不是
throw ex
重新执行throw

它是否陷入了无限抛接球 环或者它最终会离开试捕吗

不,是的

正如其他人所指出的那样,该代码对调试既没有好处,也有坏处

一个好的捕获块将捕获一个特定的预期问题,并记录和继续(该问题并不表示应用程序状态已损坏)、记录和停止(因为应用程序现在处于未知状态,继续可能破坏更多的危害)、执行其他操作(例如,退回到等效的技术/算法),等待并重试

默认情况下,应记录意外情况,并停止应用程序——要么放弃页面,要么如果是winforms应用程序,则尽可能恢复到已知状态

它是否陷入了无限抛接球 环或者它最终会离开试捕吗

不,是的

正如其他人所指出的那样,该代码对调试既没有好处,也有坏处

一个好的捕获块将捕获一个特定的预期问题,并记录和继续(该问题并不表示应用程序状态已损坏)、记录和停止(因为应用程序现在处于未知状态,继续可能破坏更多的危害)、执行其他操作(例如,退回到等效的技术/算法),等待并重试


默认情况下,应记录意外情况,并停止应用程序——要么放弃页面,要么如果是winforms应用程序,则尽可能恢复到已知状态

如果调用方未能处理该异常,则该异常仍将是未处理的异常。如果调用方未能处理该异常,则该异常仍将是未处理的异常。尽管所有这些都是正确的,并且很有帮助,我不确定这是如何解决这个问题的。@vcsjones没有人能够通过查看代码100%确定开发人员真正想要做什么。在这里,我试图解释他这样编码的一个最可能的原因。这取决于OP来推断:)我正在努力跟踪我们的一个项目中的一个bug,并且想了解异常是如何向调用堆栈的上游传播的。这很有帮助!谢谢@CameronTinker很高兴能提供帮助!一种常见的情况是,您将在异常周围放置一个包装器,并将原始异常作为InnerException
抛出新的MyCustomException(“一些有用的信息”,例如)虽然所有这些都是真实的、有帮助的,但我不确定这是如何解决这个问题的。@vcsjones没有人可以通过查看代码100%确定开发人员真正想要做什么。在这里,我试图解释他这样编码的一个最可能的原因。这取决于OP的推断:)我正在尝试t