2012-05-02 125 views
7

我有一個要求,即使在拋出異常之後程序執行流程應該繼續。如何在拋出異常後繼續執行程序?

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { 
    } 
} 

如果在第一次迭代中拋出異常,流程執行將停止。我的要求是在第一次迭代拋出異常之後,其他迭代應該繼續。 我可以在catch塊中寫邏輯嗎?

+2

您現在擁有的邏輯確實如此。如果異常將'DataSource'放入無效狀態,那麼下一次使用迭代器的嘗試可能會拋出一個不同的異常。 –

回答

-3

不,沒有語言支持來處理異常,然後跳回到導致它的語句。即使先前的子序列引發異常,您也必須在應該執行的每個操作子序列周圍包裝單獨的try...catch構造。

+1

*「不,沒有語言支持來處理異常,然後跳回到導致它的語句。」*這不是問什麼。所要求的是如何讓其他***迭代繼續下去。 –

+0

^是的。我認爲他會想要的是這樣的:在catch之後添加一個'finally',並繼續從迭代崩潰的地方開始迭代。雖然這可能是一種解決方法,但不建議並且非常難看。 –

6

如果你沒有在catch塊內部以某種方式打破循環,那麼其他迭代將會繼續,不管在前一次迭代中是否拋出異常。

試試這個簡單的例子,看看會發生什麼:

List<String> list = new ArrayList<String>(); 
list.add("1"); 
list.add("2"); 
list.add("3"); 

for(String str: list) { 
    try { 
     System.out.println(str); 
     throw new Exception("Exception for string " + str); 
    } catch(Exception ex) { 
     System.out.println("Caught exception"); 
    } 
} 

你會看到,所有的迭代執行,即使每一個拋出異常。

+0

嗨都鐸,感謝您的回覆。我知道了。我還需要放置最終種類的塊,在所有迭代之後將被調用。它不應該被稱爲每一次迭代。我怎麼能實現它?請幫幫我! – user1016403

+0

@ user1016403:在這種情況下,你需要換整個for循環中像'嘗試... finally'塊:'{嘗試爲(...){代碼}}終於{}' – Tudor

0

你現在擁有的邏輯確實如此。如果異常使DataSource爲無效狀態,使用迭代器下一次嘗試可能會拋出一個不同的異常,但是這是一個不同的問題,並具體到DataSource東西(所以你不得不看DataSource是否讓你做一些事情要處理以某種方式與其他無效狀態)。但在一般情況下,你做對了。

9

那麼首先,

有2種類型的例外。已檢查&未選中。

未經檢查的異常是您的程序無法恢復的異常。像NullPointers一樣,告訴你一些邏輯真的有問題。

檢查異常是運行時異常,並從這些異常中恢復。

因此,您應該避免使用catch statemens尋找「Exception」基類。哪些代表了兩次。您應該考慮尋找特定的異常(通常是運行時異常的子類)。

總之,還有更多。

你也應該記住,你不應該使用異常處理工作流程。通常表明你的架構在某種程度上是不足的。正如名稱所述,它們應被視爲正常執行的「例外」。

現在,考慮到你的代碼:

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { // catch any exception 
     continue; // will just skip this iteration and jump to the next 
    } 
    //other stuff ? 
} 

由於它是,它應該捕捉異常,然後繼續前進。也許有什麼你不告訴我們的? :P

不管怎麼說,希望這有助於。

1

如果同時呼籲dataSources初始化迭代器,然後異常將被抓發生在for(DataSource source : dataSources)異常。

這就是你所說的「」如果在第一次迭代中引發異常,流程執行就會停止。「」?

如果是這種情況,那麼沒有別的辦法可以做,並且循環應該而不是執行任何交互。