2014-04-16 32 views
0

我對使用try/catch塊相當陌生,所以我不知道如何執行此命令。捕獲異常後在try塊中恢復代碼

如果我發現一個錯誤,我想等一段時間(10秒左右),然後嘗試運行相同的代碼行以嘗試在我的try塊中繼續。我的程序是用Java編寫的。我已經看過這兩個頁面:Page1Page2,但它們都不在Java中。我也看過this,但他們沒有解決使用catch塊。這是可能的,我將如何實現這個在我的catch塊,而不是隻是打印錯誤?

+0

看看Thread.sleep(),你可以很容易地把它扔到一個循環中,它將暫停每個循環迭代的執行。 –

+0

@PatrickJAbareII該程序基本上可以持續運行,並且每24小時可能會出現一次錯誤。雖然主要有兩行導致錯誤,但這會爲程序增加大量時間。你認爲這將是解決這個問題的最好方法嗎? – Ctech45

+0

你沒有試圖解決導致異常的原因嗎? – Radiodef

回答

1

99%的時間,你想要在try-catch之後重新運行代碼塊,而不是有例外的行。

如果您需要從該行開始運行,那麼您就需要使用另一種只封裝該代碼的方法(可能也會將try-catch移動到此處)。

什麼,我會建議是這樣的:

void method(){ 
    try{ 
     codeline1; 
     codeline2; 
     codeline3; 
     codeline4; 
    } 
    catch(Exception ex) 
    { 
     restorClassStateBeforeCodeLine1(); 
     method(); 
    } 
} 

到那個剪斷,我提議在一個單獨的方法,你的整個try-catch

等待隨機間隔也是不好的做法。你永遠不知道10秒是正確的還是完全正確。

,我建議對另一種方法是:

label: { 
    try { 
     ... 
     if (condition) 
      break label; 
     ... 
    } catch (Exception e) { 
     ... 
    } 
} 

它使用java labels重試的一部分。我從來沒有嘗試過,但break可能會在catchtry標籤。

0

我不認爲有可能從catch-block內返回到try-block中的某一行。因爲當執行throw時,運行時系統將從調用堆棧中彈出框架,查找異常處理程序以匹配拋出的異常,並且一旦框架從堆棧彈出,它就消失了。有關這方面的更多信息可以發現here

你可以做的是調用從catch塊內導致throw的方法。但這意味着它會從一開始就執行你的方法,所以也許你想重新排列你的代碼,這樣就不會引起任何其他問題。編輯:另一個答案確切地說明了我的意思。

0

這個簡單的程序循環通過數組的值,測試每個,直到找到不產生異常

public static void main(String[] args) { 
    int[] array=new int[]{0,0,0,0,5}; 
    for(int i=0; i<array.length;i++) { 
     try { 
      System.out.println(10/array[i]); 
      break; 
     } catch(Exception e) { 
      try { Thread.sleep(1000); } catch(Exception ignore){} 
     } 
    } 
} 
+0

這與這個問題有什麼關係?我不明白。沒有惡意。 – Andrei

+0

@Andrei它執行一行代碼。如果代碼生成異常,則等待一秒,然後重試該代碼行。否則,它會繼續。這不是問什麼? – deanosaur

+0

或多或少。根據我的理解,他要求在嘗試中有更多行代碼的情況下回答。 – Andrei

0
while(true){ 
    try{ 
     //actions where some exception can be thrown 
     break;//executed when no exceptions appeared only 
    } 
    catch(YourException e){ 
     Thread.sleep(10_000); 
    } 
} 

,而你指令已經不執行該循環將重複的值。當try-block中的代碼執行成功時可以幫助你離開這個循環

0

既然你說只有2行代碼會遇到間歇性錯誤,請嘗試類似這樣的事情。

public static void main(String... args) 
    { 
     try 
     { 
      //Some Logic 

      //Error throwing logic in method 
      while(!doLogic()) 
      { 
       Thread.sleep(1000);//Sleep here or in doLogic catch 
      } 

     //Continuing other logic! 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    static Integer i = null; 
    public static boolean doLogic() 
    { 
     try 
     { 
      //Lines that throw error 
      System.out.println(i.toString());//NPE First run 
     } 
     catch (Exception e) 
     { 
      i = 1; 
      return false; 
     } 
     return true; 
    } 
相關問題