异常处理 try catch inside catch
Posted
技术标签:
【中文标题】异常处理 try catch inside catch【英文标题】:Exception handling try catch inside catch 【发布时间】:2011-04-01 08:51:00 【问题描述】:我最近遇到了一位程序员同事编写的代码,他在其中的 catch 中有一个 try-catch 语句!
请原谅我无法粘贴实际代码,但他所做的与此类似:
try
//ABC Operation
catch (ArgumentException ae)
try
//XYZ Operation
catch (IndexOutOfRangeException ioe)
//Something
我个人觉得这是我见过的最糟糕的一些代码! 在 1 到 10 的范围内,你认为我应该多久去告诉他我的想法,还是我反应过度了?
编辑: 他在 catch 中实际上在做什么,他正在执行一些可以/应该在初始尝试失败时执行的操作。我的问题是拥有干净的代码和可维护性。将异常从第一个 catch 委托给不同的函数或调用函数是可以的,但是添加更多可能会或可能不会在第一个 catch 中引发异常的代码是我觉得不好的。我尽量避免使用多个堆叠的“if-loop”语句,我发现这同样糟糕。
【问题讨论】:
这很常见,所以没有看到代码实际做了什么——这本身并没有什么问题。 我宁愿问他想达到什么目的。 【参考方案1】:这是一个案例:
try
//Dangerous Operation
catch (AnyException ae)
try
//Do rollback which can fail
catch (RollbackFailedException rfe)
//Log that
finally
try
//close connection but it may fail too
catch (IOException ioe)
//Log that
这和@x0n 说的差不多。在尝试关闭资源或尝试解决另一个异常带来的情况时,您可能需要处理异常。
【讨论】:
有没有更简洁的方法来处理这个问题。 @ArpitAgrawal 使用像 Polly 这样的花哨的异常/尝试/重试管理包。【参考方案2】:为什么这么糟糕?它在概念上与以下没有什么不同:
void TrySomething()
try
catch (ArgumentException)
HandleTrySomethingFailure();
void HandleTrySomethingFailure()
try
catch (IndexOutOfRangeException)
在你去那里给他一块你的大脑之前(试试顶叶,这特别令人反感),你到底要对他说什么?你将如何回答众所周知的“为什么”?
更讽刺的是,当jitter内联这段代码时,它看起来和你的例子一模一样。
-奥辛
【讨论】:
我完全同意。如果您觉得他的代码有问题并愿意就此与他对质,那么您最好准备好一个出色的替代方案。 是的。将嵌套的 try-catch 拆分为自己的方法是可以做到的最好的方法。【参考方案3】:不知道代码的作用是不可能的。但这样做并不不寻常。
例如如果您在处理异常时必须清理资源,则清理代码本身可能具有引发异常的能力。
【讨论】:
以上是关于异常处理 try catch inside catch的主要内容,如果未能解决你的问题,请参考以下文章
异常处理----使用 try…catch…finally 处理异常