我對使用try/catch塊相當陌生,所以我不知道如何執行此命令。捕獲異常後在try塊中恢復代碼
如果我發現一個錯誤,我想等一段時間(10秒左右),然後嘗試運行相同的代碼行以嘗試在我的try塊中繼續。我的程序是用Java編寫的。我已經看過這兩個頁面:Page1,Page2,但它們都不在Java中。我也看過this,但他們沒有解決使用catch塊。這是可能的,我將如何實現這個在我的catch塊,而不是隻是打印錯誤?
我對使用try/catch塊相當陌生,所以我不知道如何執行此命令。捕獲異常後在try塊中恢復代碼
如果我發現一個錯誤,我想等一段時間(10秒左右),然後嘗試運行相同的代碼行以嘗試在我的try塊中繼續。我的程序是用Java編寫的。我已經看過這兩個頁面:Page1,Page2,但它們都不在Java中。我也看過this,但他們沒有解決使用catch塊。這是可能的,我將如何實現這個在我的catch塊,而不是隻是打印錯誤?
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
可能會在catch
和try
標籤。
我不認爲有可能從catch-block內返回到try-block中的某一行。因爲當執行throw
時,運行時系統將從調用堆棧中彈出框架,查找異常處理程序以匹配拋出的異常,並且一旦框架從堆棧彈出,它就消失了。有關這方面的更多信息可以發現here
你可以做的是調用從catch塊內導致throw
的方法。但這意味着它會從一開始就執行你的方法,所以也許你想重新排列你的代碼,這樣就不會引起任何其他問題。編輯:另一個答案確切地說明了我的意思。
這個簡單的程序循環通過數組的值,測試每個,直到找到不產生異常
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){}
}
}
}
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中的代碼執行成功時可以幫助你離開這個循環
既然你說只有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;
}
看看Thread.sleep(),你可以很容易地把它扔到一個循環中,它將暫停每個循環迭代的執行。 –
@PatrickJAbareII該程序基本上可以持續運行,並且每24小時可能會出現一次錯誤。雖然主要有兩行導致錯誤,但這會爲程序增加大量時間。你認爲這將是解決這個問題的最好方法嗎? – Ctech45
你沒有試圖解決導致異常的原因嗎? – Radiodef