异常处理 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 处理异常

Java异常处理try...catch语句

Java异常处理机制:try...catch...的执行流程

异常-try...catch的方式处理异常2

异常-try...catch的方式处理异常1

异常处理