【问题标题】:Exception handling try catch inside catch异常处理 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”语句,我发现这同样糟糕。

【问题讨论】:

  • 这很常见,所以没有看到代码实际做了什么——这本身并没有什么问题。
  • 我宁愿问他想达到什么目的。

标签: java exception exception-handling try-catch


【解决方案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】:

不知道代码的作用是不可能的。但这样做并不不寻常

例如如果您在处理异常时必须清理资源,则清理代码本身可能具有引发异常的能力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多