簡體   English   中英

處理多個異常的通用/集中方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM