Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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# 在finally块中抛出异常是否是一种好的做法?_C#_Exception_Try Catch Finally - Fatal编程技术网

C# 在finally块中抛出异常是否是一种好的做法?

C# 在finally块中抛出异常是否是一种好的做法?,c#,exception,try-catch-finally,C#,Exception,Try Catch Finally,有一个很好的问题是讨论在finally块中抛出异常有时会产生意外的结果 我想不出有什么好的理由让你想在finally块中抛出一个异常。如果以前有异常,它将始终丢失。我总是看到最终用来清理的方式永远不会抛出异常 有人能解释一下什么时候在finally块中抛出异常是合适的吗 try catch finally是一个非常重要的构造。您可以确定,即使抛出异常,finally块中的代码也将被执行。在处理外部资源时,释放它们是非常重要的。垃圾收集不会帮你的。在最后一部分中,您不应该使用return语句或抛出

有一个很好的问题是讨论在finally块中抛出异常有时会产生意外的结果

我想不出有什么好的理由让你想在finally块中抛出一个异常。如果以前有异常,它将始终丢失。我总是看到最终用来清理的方式永远不会抛出异常


有人能解释一下什么时候在finally块中抛出异常是合适的吗

try catch finally是一个非常重要的构造。您可以确定,即使抛出异常,finally块中的代码也将被执行。在处理外部资源时,释放它们是非常重要的。垃圾收集不会帮你的。在最后一部分中,您不应该使用return语句或抛出异常。这样做是可能的,但这是一种不好的做法,可能会导致不可预测的结果。

当您最终抛出一个
异常时,它会向上传播,最重要的是在抛出
异常时停止,因此finally的其余部分不会执行。此外,如果try块中发生异常,则异常将消失,并且当前异常将从finally块中抛出

我无法想象任何场景,在这种场景中,您最终会抛出
异常
,然后出于特定原因在调用方级别处理它(可能有其他方法来管理此类逻辑),因此您可以在调用方级别根据抛出的
异常
进一步处理


我所能说的是,所有的眼睛都会阅读并尝试在以后遵循代码,这将是一个健康的惊喜。

这很好,得到了.NET的良好支持。问题是捕捉异常,这是一个非常糟糕的做法。正确恢复程序状态的几率非常低。

最终内部抛出的异常将被调用方所在的相应catch块捕获。但是,正如秘鲁所说,既然要更加安全和清洁,你为什么还要考虑把事情搞砸呢?最后是清理混乱,而不是让它变得更糟。您提到的线程从清理代码引发异常开始…不是通过
throw
的方式,与开发人员的期望相反…那么是否存在“是否从Finally块引发异常以及何时”的问题呢?我猜不是…在那篇原始帖子中,我给出了答案,说要将
finally
块的内容包装到try..catch中,以避免finally块中出现任何可能的异常…我仍然认为,应该这样做,如果有人警告finally块可能抛出异常,如果只有WCF人员知道这不是从
finally
抛出的好主意,那么他们可能不会添加坏的
.Dispose()
!您是说可以从finally抛出异常,但不能捕获finally块抛出的异常吗?我不明白这个道理。这不总是导致应用程序关闭吗?当然。这就是你想要的。如果无法将程序的状态恢复到引发异常的代码开始运行之前的状态,则无法处理异常。一定要避免假设总是捕获异常。