0

如果您要打开连接,通常您所做的是 try-catch-finally

try {
    doSomething();
} catch(Exception e) {
    // handle the exception
} finally {
    close();
}

在我的场景中,我有两个 catch 和两个不同的关闭:正常情况下的 close() 和抛出 StrangeException 的 closeStrange() 。

我想出了这样的事情:

try {
    doSomething();
} catch(StrangeException e) {
    closeStrange();
    throw new MyExc(e);
} catch(Exception e) {
    close();
    throw new MyExc(e);
}
close();

我想知道以这种方式处理这种情况是否安全。

编辑:

可能还不清楚:我只想调用一个结束。如果抛出 StrangeException,则 closeStrange(),如果抛出另一个异常或不抛出任何异常,则 close()。

4

4 回答 4

5

不,您目前处理此问题的方式并不安全:

  • 您没有使用finally块,因此抛出的任何非异常都会让您在不关闭连接的情况下离开
  • 您正在“处理”任何异常,这几乎肯定是不合适的

你可能想要:

boolean closedStrangely = false;
try {
   ...
} catch (StrangeException e) {
    closeStrangely();
    closedStrangely = true;
    throw e; // Or maybe not, or maybe throwing some custom exception
} finally {
    if (!closedStrangely) {
        close();
    }
}

请注意,如果closeStrangely()抛出异常,这将尝试“正常”关闭它。如果您不想要这种行为,请在调用之前closedStrangely设置为 true 。closeStrangely

编辑:即使你想在某些情况下抛出自定义异常,你几乎肯定应该捕获Exception.

于 2012-08-21T13:01:13.887 回答
1

一个更常见的模式可能是。

try {
    doSomething();
} catch(StrangeException e) {
    // handle strange exception without closing.
} catch(Exception e) {
    // handle the exception without closing.
} finally {
    close();
}
于 2012-08-21T13:01:15.347 回答
0
try {
    doSomething();
} catch(Exception e) {
    if(e instanceof StrangeException) {
        closeStrange();
    } else {
        close();
    }
} finally {
   close();
}

您可以使用 instanceof 检查异常

于 2012-08-21T13:00:31.323 回答
0

关于什么:

try {
    doSomething();
    close();
} catch(StrangeException e) {
    closeStrange();
    throw;
} catch(Throwable e) {
    close();
    throw;
}

通过这种方式,您调用其中一个且仅一个closecloseStrange在任何情况下,您都让异常“通过”。

于 2012-08-21T13:00:49.543 回答