2011-01-14 48 views
2
try 
{ 
    statement 1; 
    statement 2; 
    statement 3; 
    statement 4; 
    statement 5; 
} 
catch 
{ 
} 

以上是典型的試穿。如果其中一條語句進入捕捉狀態,編碼將跳轉其餘語句。如何在C#中異常恢復計算?

我想要做的是..

讓我們說,聲明中2有一個錯誤並進入例外,我還是想在聲明3,4工作,5

我米只是好奇我怎麼能做到這一點?

最簡單的答案是5次嘗試。

但我認爲這太幼稚了。

+0

讓你想 「的錯誤繼續下一步」 在C#中? – Simon 2011-01-14 03:19:46

+0

*當你想要處理異常嗎?如果`2`和`4`都會拋出異常呢?一旦`5'完成,你想要處理它們嗎?或者你只是想忽略所有的錯誤? – Ani 2011-01-14 03:20:58

回答

6

使用單獨的try .. catch構造將是最好的事情,因爲您應該處理最具體的異常(對於不同的語句可能不同)。此外,異常可能會導致無效狀態,因此繼續執行可能不是最好的做法。

如果你只是尋找一個簡單的語法來寫它,你需要重複同樣的異常處理,你可以使用lambda表達式和寫類似:

CallWithCatch 
(() => statement1, 
    () => statement2, 
    () => statement3, 
    /* ... */); 

CallWithCatch定義看起來像這:

void CallWithCatch(params Action[] statements) { 
    foreach(var statement in statements) { 
    try { 
     statement(); 
    } catch(/* your exception */) { 
     // your exception handler 
    } 
    } 
} 
1

你需要單獨捕獲每個例外。

try 
{  
    statement 1;  
} 
catch {} 

try 
{ 
    statement 2; 
} 
catch {} 

// etc 

或者您可以提取statement1statement2等進入自己的方法,其中每個都包含自己的try/catch。通過這種方式,每個操作都可以關注任何特定的異常,並且您可以處理所有預期的異常,讓未處理的異常像平常一樣冒泡。

3

因此,一般來說,您的所有語句可能會引發異常,並且如果引發異常,您希望繼續執行以下語句。最簡單的解決方法是:

try 
{ 
    statement1; 
} 
catch {} 
try 
{ 
    statement2; 
} 
catch {}; 
... 

這很糟糕。改進的方法是:

public void TryStatements(params Action[] actions) 
{ 
    foreach(Action act in actions) 
    { 
    try 
    { 
     act(); 
    } 
    catch(SomeCommonException ex) 
    { 
     //do something special 
    } 
    catch(Exception ex) 
    { 
     //something else 
    } 
    } 
} 

那麼你可以:

TryStatement(()=>statement1,()=>satement2);