我知道Java異常的開銷已經在SO上完蛋了,但是我沒有發現任何能解決我的情況的東西。我有一個Future,它在調用get()時可能會拋出一個ExecutionException,其中包含任意數量的特定於應用程序的異常。我想知道使用更好看的try-catch塊而不是醜陋的if-instanceof-then-cast模式是否有顯着的開銷。例如,它可能是這個樣子:重新拋出Java異常和使用instanceof/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);
}
}
我的理論是不應該有,因爲
- 異常和堆棧跟蹤已經構建了鉅額的開銷。
- 無論如何,我在兩種方法中都對異常對象執行反射。
- 異常立即被捕獲並且永不傳播。
第一個例子的一個缺陷是'getCause()'可以返回'null',並且'ExecutionException'不會覆蓋它。當你拋出'null'時會發生什麼? –
好吧,我可以檢查null(雖然這應該是非常罕見的),但這並不影響我的問題,因爲這只是一個簡單的檢查。 – Nick
你打算在不同情況下做什麼(伐木除外)。我的意思是給你一個例子,而不是你的// ...在catch塊內 – kiruwka