我有一個要求,即使在拋出異常之後程序執行流程應該繼續。如何在拋出異常後繼續執行程序?
for(DataSource source : dataSources) {
try {
//do something with 'source'
} catch (Exception e) {
}
}
如果在第一次迭代中拋出異常,流程執行將停止。我的要求是在第一次迭代拋出異常之後,其他迭代應該繼續。 我可以在catch塊中寫邏輯嗎?
我有一個要求,即使在拋出異常之後程序執行流程應該繼續。如何在拋出異常後繼續執行程序?
for(DataSource source : dataSources) {
try {
//do something with 'source'
} catch (Exception e) {
}
}
如果在第一次迭代中拋出異常,流程執行將停止。我的要求是在第一次迭代拋出異常之後,其他迭代應該繼續。 我可以在catch塊中寫邏輯嗎?
不,沒有語言支持來處理異常,然後跳回到導致它的語句。即使先前的子序列引發異常,您也必須在應該執行的每個操作子序列周圍包裝單獨的try...catch
構造。
*「不,沒有語言支持來處理異常,然後跳回到導致它的語句。」*這不是問什麼。所要求的是如何讓其他***迭代繼續下去。 –
^是的。我認爲他會想要的是這樣的:在catch之後添加一個'finally',並繼續從迭代崩潰的地方開始迭代。雖然這可能是一種解決方法,但不建議並且非常難看。 –
如果你沒有在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");
}
}
你會看到,所有的迭代執行,即使每一個拋出異常。
嗨都鐸,感謝您的回覆。我知道了。我還需要放置最終種類的塊,在所有迭代之後將被調用。它不應該被稱爲每一次迭代。我怎麼能實現它?請幫幫我! – user1016403
@ user1016403:在這種情況下,你需要換整個for循環中像'嘗試... finally'塊:'{嘗試爲(...){代碼}}終於{}' – Tudor
你現在擁有的邏輯確實如此。如果異常使DataSource
爲無效狀態,使用迭代器下一次嘗試可能會拋出一個不同的異常,但是這是一個不同的問題,並具體到DataSource
東西(所以你不得不看DataSource
是否讓你做一些事情要處理以某種方式與其他無效狀態)。但在一般情況下,你做對了。
那麼首先,
有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
不管怎麼說,希望這有助於。
如果同時呼籲dataSources
初始化迭代器,然後是異常將不被抓發生在for(DataSource source : dataSources)
異常。
這就是你所說的「」如果在第一次迭代中引發異常,流程執行就會停止。「」?
如果是這種情況,那麼沒有別的辦法可以做,並且循環應該而不是執行任何交互。
您現在擁有的邏輯確實如此。如果異常將'DataSource'放入無效狀態,那麼下一次使用迭代器的嘗試可能會拋出一個不同的異常。 –