异常处理尝试捕获内部catch

top*_*ard 37 java exception-handling exception try-catch

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

请原谅我无法粘贴实际代码,但他所做的与此类似:

try
{
 //ABC Operation
}
catch (ArgumentException ae)
{
   try
   {
      //XYZ Operation
   }
   catch (IndexOutOfRangeException ioe)
   {
      //Something
   }
}
Run Code Online (Sandbox Code Playgroud)

我个人觉得这是我见过的最差的代码!在1到10的范围内,你认为我应该多久去给他一点心思,还是我过度反应?

编辑:他在捕获中实际做了什么,他正在执行一些操作,这些操作可以/应该在初始尝试失败时完成.我的问题是拥有干净的代码和可维护性.将第一个catch中的异常委托给另一个函数或调用函数就可以,但是添加更多代码可能会或者可能不会将异常抛入第一个catch中,这是我觉得不好的.我试图避免多个堆叠的"if-loop"语句,我发现这同样糟糕.

x0n*_*x0n 145

为什么那么糟糕?它在概念上与以下情况没有什么不同:

void TrySomething() {
   try {


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

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}
Run Code Online (Sandbox Code Playgroud)

在你去那里并给他一块脑之前(尝试顶叶,这特别令人反感),你究竟要对他说什么?你会如何回答众所周知的"为什么?"

更具讽刺意味的是,当抖动内联这段代码时,它看起来就像你的例子.

-Oisin

  • 我完全同意.如果你觉得他的代码有问题并且愿意与他对峙,你最好有一个很好的替代品准备好呈现. (19认同)

Col*_*ert 22

这是一个案例:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这和@ x0n说的差不多.在尝试关闭资源或尝试解决另一个异常带来的情况时,您可能需要处理异常.


Bri*_*new 19

不知道代码是什么,这是不可能的.但这样做并不罕见.

例如,如果您在处理异常时必须清理资源,那么清理代码本身可能会抛出异常.