异常处理尝试在捕获内部捕获

我最近遇到了一个程序员同事写的代码,他在一个捕获中有一个try-catch语句!

请原谅我无法粘贴实际代码,但他所做的是类似于以下内容:

try
{
 //ABC Operation
}
catch (ArgumentException ae)
{
   try
   {
      //XYZ Operation
   }
   catch (IndexOutOfRangeException ioe)
   {
      //Something
   }
}

我个人觉得这是我见过的最差的代码之一!在1到10的范围内,你认为我应该多快去给他一个我的想法,或者我反应过度了?

编辑:他在捕获中实际执行的操作,他正在执行一些在初始尝试失败时可以/应该完成的操作。我的问题是有一个干净的代码和可维护性。将异常从第一个捕获委派给不同的函数或调用函数是可以的,但是添加更多的代码可能会或可能不会在第一个捕获中引发异常,这是我认为不好的。我试图避免多个堆叠的“if-loop”语句,我发现这同样糟糕。


答案 1

为什么会这样糟糕?从概念上讲,这与以下没有什么不同:

void TrySomething() {
   try {


   } catch (ArgumentException) {
        HandleTrySomethingFailure();
   }
}

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}

在你去那边给他一块你的大脑(试试顶叶,它特别令人反感)之前,你到底要对他说些什么?您将如何回答众所周知的“为什么”?

更具讽刺意味的是,当抖动内联此代码时,它看起来将与您的示例完全相同。

-大新


答案 2

这是一个案例:

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说的差不多。在尝试关闭资源或尝试解决另一个异常带来的情况时,可能需要处理异常。


推荐