2014-01-30 73 views
0

我想如何處理我的例外,並仍然避免重複的代碼的意見。以下是我想如何處理這種情況。處理多個例外,但避免重複的代碼

避免重複代碼的情況(我不喜歡在這裏使用instanceof)。

try{ 

    //some code which might throw multiple different exceptions. 

} catch(Exception e) { 

    //do something here 

    if(e instanceof IOException) { 
     // do something only when this type exception occurred. 
    } else if(e instanceof SQLException){ 
     // do something only when this type of exception occurred. 
    } else if(e instanceof SomeCustomExceptionMaybe){ 
     // do something only when this type of exception occurred. 
    } 

    //continue exception handling here. 
} 

沒有的instanceof情況(我真的不喜歡重複的代碼)。

try{ 

    //some code which might throw multiple different exceptions. 

} catch(IOException e1) { 
    // The order must always be this. 
    // do something general for each exception 
    // do something only with this exception 
    // do something general again. 
} catch(SomeCustomExceptionMaybe e2) { 
    // The order must always be this. 
    // do something general for each exception 
    // do something only with this exception 
    // do something general again. 
} //and so on 

PS:儘量避免在Java 7的異常處理給出答覆時:

catch(IOException | SomeOtherTypeException | AnotherTypeException) 

編輯:我不使用Java 7的,這就是爲什麼我問基於java 7,避免響應。

+0

把應例外塊內執行的代碼放到一個方法,從內部調用方法你異常塊? –

+1

你能詳細說明爲什麼你確實不想使用Java 7異常處理? –

+0

@CeilingGecko:我想,它仍然需要一個instanceof檢查。 –

回答

2

首先,顯而易見的解決方案是使用方法:

catch(IOException e1) { 
    doSomethingGeneral(); 
    // do something only with this exception 
    doSomethingGeneralAgain(); 
} 

這使得一些重複,但。在冗長的價格,因爲Java沒有lambda表達式,但(但在Java中8),你可以提取一些匿名類裏面的具體行爲:

catch(IOException e1) { 
    handleException(new Runnable() { 
     @Override 
     public void run() { 
      // do something only with this exception 
     } 
    }); 
} 

其中handleException()將像這樣工作:

private void handleException(Runnable specificBehavior) { 
    // do something general 
    specificBehavior.run(); 
    // do something general again 
} 

我不能等待的Java 8,這將使這是改寫:

catch(IOException e1) { 
    handleException(() -> { 
     // do something specific 
    }); 
} 
+1

我在問這個問題之前選擇了使用方法,但我想也許有一種方法可以完全刪除重複的代碼。我不是** Java **中關閉的粉絲; _對我來說,它們使代碼複雜化(使其更難以閱讀),而不是使其更易於理解。 – Daniel

2

像第一個例子那樣捕獲原始的Exception是非常糟糕的解決方案。 Exception是應檢測和處理的檢查異常(IOException等)的父類;而且對於RuntimeException s也是如此,這些信號編程錯誤(沒有檢查參考無效或數組索引等)通常不應被捕獲 - 而是被糾正。

此外,捉一個非常廣泛的Exception可能會有一些意想不到的副作用當try塊中的代碼後來被修改,並引發新類型的異常:他們將現有的catch塊默默捕獲。

因此,我認爲對於每種不同類型的異常都有一個截然不同的catch塊會好得多,即使它意味着複製(pre-Java7之前的)一些錯誤處理代碼。

當然,限制這種重複代碼的最明顯的方法是外部它的常用方法:

try { 
    ... 
} catch (FooException fe) { 
    handleException(fe); 
} catch (BarException be) { 
    handleException(be); 
} 
... 

private void handleException(Exception e) { 
    ... 
} 

如果所有的異常都以同樣的方式嚴肅查處這是確定。但只要你想根據確切的異常類型做不同的事情,就需要使用instanceof運算符,這總是一種強烈的代碼異味。

總之,即使它現在意味着一些代碼重複,我也會將personnaly保留在catch塊中的錯誤處理代碼 - 它在長期內仍然更加穩健。

0

我沒有測試了以下的方法還沒有,但也許它可以幫助:

try{ 

    //some code which might throw multiple different exceptions. 

} catch(Exception e) { 
    if ((e instanceof IOException) || (e instanceof SomeCustomExceptionMaybe)) { 
     //do something 
    } else { 

    } 
} 
+0

這並不解決重複代碼的實例,因爲我需要以不同的方式處理每個異常。 – Daniel