如果發生任何錯誤,我需要觸發一些代碼。基本上我需要一個finally
塊,只有在發生異常情況下才會執行。我會實現它是這樣的:如何在Java中使用`finally`實現錯誤case
HttpURLConnection post(URL url, byte[] body) throws IOException {
HttpURLConnection connection = url.openConnection();
try {
OutputStream out = connection.getOutputStream();
try {
out.write(body);
} finally {
out.close();
}
return connection;
} catch (Throwable t) {
connection.disconnect();
throw t;
}
}
看起來不錯,但它不會編譯:我的功能不能扔Throwable
。
我可以重新寫:
} catch (RuntimeException e) {
connection.disconnect();
throw e;
} catch (IOException e) {
connection.disconnect();
throw e;
}
但即使如此,我是一個)丟失了所有的錯誤和b)必須隨時更改我的實現拋出不同類型的異常修復這處代碼。
這是一般可以處理這種情況嗎?
沒有檢查異常只是非常棒* – cdhowie 2010-12-09 22:57:51
@cdhowie:我也不喜歡檢查異常,但這是一個錯誤和Throwable被檢查但未檢查的情況;運行時沒有任何內容聲明「拋出XxxError」,但是如果你試圖(重新)拋出XxxError,它會被檢查 - HUH?那是怎麼回事? Checked異常應該使用由編譯器檢查的Throwable的CheckedException抽象子類來完成,而不是當前的「魔術」 - 當然這使我能夠將Throwable重新引發一個檢查的異常,但我不確定這是否是這樣壞事。 – 2010-12-10 01:55:51
@軟件猴子:實際上`錯誤`沒有被檢查 - 我只是檢查了。 :)你可以肯定地捕獲並重新拋出`Error`,而不必在`throws`子句中提及它。它會爲我的解決方案增加另一個案例,使其更不易維護。現實情況是,Java代替`CheckedException`,並且有兩個未經檢查的樹,`RuntimeException`和`Error`,其他所有內容都被檢查。 – SnakE 2010-12-10 03:55:38