[英]Common / centralized method to handle multiple exceptions
這是在Java 6上
我可以有一個通用的方法來處理我的異常 - 所以不要在每個方法中執行n次
try {
// Do something
} catch (XException e) {
// Do something
} catch (YException e) {
// Do something
} catch (ZException e) {
// Do something
}
我有
try {
// Do something
} catch (Exception e) {
handleAll (e);
}
和方法handleAll(e)
if e.instanceOf(XException)
else if e.instanceOf(YException)
else if e.instanceOf(ZException)
第二種方法有什么問題嗎?
更新:
我最初的問題是關於“集中處理”在一個地方對於檢查和運行時異常。 答案指出我應該避免使用instanceof()。
@ aioobe的想法看起來很整潔。 對這種方法有任何負面意見嗎?
我認為有一個小問題。 由於您確實希望handleAll
方法重新拋出任何未捕獲的異常,因此必須將其聲明為throws Exception
。 這意味着調用handleAll
的方法handleAll
。
如果X-
, Y-
和ZException
都是RuntimeExceptions
我認為沒有錯。 (我可能忽略了一些東西,因為這是我第一次看到這種方法。)
為了確保instanceof
方法的行為與catch子句完全相同,我會考慮設計handleAll(RuntimeException e)
但是:
private void handleAll(RuntimeException e) {
try {
throw e;
} catch (XException xe) {
...
} catch (YException xe) {
...
} catch (ZException xe) {
...
}
}
這是一個不好的方法。 它將減少LOC(代碼行),但它會產生難以理解,更依賴於資源(它需要更多的內存和處理能力)。 它還降低了可讀性。
所以第一個是最好的一個
你可以做到這一點,但我認為它不是很好的編碼風格。 將異常處理程序保持在拋出Exceptions的行附近很方便。 假設您的代碼發生了變化,並拋出了一個新的異常。 然后你必須更新處理它們的方法; 所以現在你必須在兩個地方做出改變。 如果代碼不再拋出特定的異常,或者您決定應在更高級別處理某些異常,則會發生相同的情況。
另外,我對“捕獲(Exception exc)”持謹慎態度。 它太籠統了,盡量讓你的Exception處理程序盡可能具體。
Java 7將使事情變得更好。 因為捕獲多個異常是可能的。
第二種方法有一些問題:如果被調用的方法簽名被修改並拋出一種新的異常,代碼仍然可以正常編譯,而你沒有正確處理這個新的異常。
使用第一種方法,編譯器將產生錯誤,這將強制您處理新的異常。
第二種方法將捕獲所有Exception
,包括RunTimeException
。 確保正確處理它們。
我認為每個異常都是唯一的(當代碼中的比較位置,而不是拋出異常的時候),所以你不應該異常處理異常。
你可能希望每次IE都處理異常差別很小。 如果某些地方被拋出FileNotFoundException你可能會創建一個新文件,但其他時間可能是致命的異常會導致應用程序終止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.