2015-05-12 57 views
2

在這種情況下:在do ... while()評估中處理try/catch異常的最佳方法?

Cursor cursor = dbHandler.fetchEvents(); 
boolean someBool = true; 

do { 
    someStuff(); 
    variables = things; 
    otherStuff(); 
} while (someBool && cursor.moveToNext()); 

有一種可能性,即cursor.moveToNext()可能拋出一些例外的,特別是如果我的數據庫被意外關閉,而我用光標的工作。

處理while()評估中引發的任何可能異常的最佳方法是什麼?目前,整個事情只是崩潰。我寧願避免這種情況。編譯器不喜歡我直接將try/catch添加到while()eval中的努力,而且它很醜陋。我想我需要創建,這是否一種新的方法:

private boolean moveToNext(cursor) { 
    boolean result = false; 
    try { 
     result = cursor.moveToNext(); 
    } catch (Exception e) { 
     ... error handling ... 
    } 
    return result; 
} 

,然後改變我的eval環路:

Cursor cursor = dbHandler.fetchEvents(); 
boolean someBool = true; 

do { 
    someStuff(); 
    variables = things; 
    otherStuff(); 
} while (someBool && moveToNext(cursor)); 

沒有人有任何其他建議?如果是這樣,我很樂意聽到他們。謝謝!

+2

您提出的解決方案正是我所推薦的解決方案。 – tnw

+1

我建議將'return result'移入try或finally。如果你使用try/catch,try/catch/finally應該是你的頂級範圍,try塊中的業務邏輯,catch塊中的錯誤處理以及任何你想發生的事情,而不管是否存在finally塊中的錯誤。 – Bardicer

回答

2

將整個代碼塊放入一個try/catch塊中,並且該塊應該在丟失數據庫連接時進行捕獲。

然後,您需要重新調查整個模塊以查看清理過程是否合理,併爲您提供try/catch的「catch塊」的內容。一旦你這樣做了,你可能會注意到你的真實代碼有了進一步的改進,這可能會讓你發佈這個例子,而且當你關注你所關心的東西時,這些建議就不那麼​​重要了。

2

這真的取決於您在遇到錯誤時想要發生的情況。當你得到異常時,你應該跳過循環的迭代並繼續下一個循環,或者直接停止迭代?或者是整個循環系統發生故障,並且您需要告訴用戶出現問題?

如果你真的關心分別處理循環的每個迭代,那麼你的方法將工作正常。或者,如果你想只檢測整個循環是否遇到錯誤或沒有,那麼你可以用在try塊整個事情:

try { 
    Cursor cursor = dbHandler.fetchEvents(); 
    boolean someBool = true; 

    do { 
     someStuff(); 
     variables = things; 
     otherStuff(); 
    } while (someBool && cursor.moveToNext()); 
} catch (Exception e) { 
    //report to the user that the loop failed 
} 
+0

外部邏輯(我沒有包括它,只是問題很明顯)是,如果someBool!= true或cursor.moveToNext()!= true,則完成此循環並且不需要發生其他任何事情。這整個區塊超過300行(我沒有寫),但我認爲這可能是有道理的,在try/catch中打電話給它,作爲防止崩潰的最後努力。 – AWT

+0

@AWT異常並不僅僅是爲了防止崩潰。它們用於向用戶或調用代碼報告鏈上的錯誤。你需要問自己的問題是你需要傳遞什麼信息 - 你只需要停止循環?你需要報告循環的特定迭代嗎?或者你只需​​要報告循環遇到錯誤? –

+0

好點。在這種情況下,防止碰撞是我最關心的問題。次要的是要乾淨地終止這個循環,並讓調用者知道它已完成。調用代碼有邏輯來處理這一切是否評估爲真或假,我只是把它的大部分留出來讓它易於閱讀。 – AWT

1

您可以隨時在while()移動代碼的循環體,無大特賣

while(true) 
{ 

    ... 
    if(! someBool) 
     break; 
    if(! cursor.moveNext()) 
     break; 
} 

然後用任何你喜歡的代碼包圍它。