我知道 Java 异常的开销已经在 SO 上完成了,但我没有找到任何可以解决我的情况的东西。我有一个 Future,它在调用 get() 时可能会抛出一个 ExecutionException,其中包含任意数量的特定于应用程序的异常。我想知道使用更好看的 try-catch 块而不是丑陋的 if-instanceof-then-cast 模式是否会产生很大的开销。例如,它可能看起来像这样:
private Response handleException(ExecutionException e) throws MyApplicationException {
try {
throw e.getCause();
} catch (ApplicationException1 e1) {
// known error
throw MyApplicationException.convert(e1);
} catch (ApplicationException2 e2) {
// create error response
return new Response(e2);
} catch (Throwable t) {
// unknown error
throw new RuntimeException(t);
}
}
private Response handleException2(ExecutionException e) throws MyApplicationException {
Throwable cause = e.getCause();
if (cause instanceof ApplicationException1) {
ApplicationException1 e1 = (ApplicationException1) cause;
throw MyApplicationException.convert(e1);
} else if (cause instanceof ApplicationException2) {
ApplicationException2 e2 = (ApplicationException2) cause;
return new Response(e2);
} else {
throw new RuntimeException(cause);
}
}
我的理论是不应该有大量的开销,因为
- 异常和堆栈跟踪已经构建。
- 无论如何,我都在这两种方法中对异常对象进行反射。
- 异常会立即被捕获并且永远不会传播。