2013-04-08 122 views
0

我知道,我們可以使用try-catch塊來處理異常。但是我對Try-Catch的用法有些懷疑。 是什麼異常處理Try-Catch塊區別

try 
    { 
     //Some code 
    } 
    catch 
    { 

    } 

try 
    { 
    //Some code 
    } 
    catch(Exception) 
    { 

    } 

try 
    { 
    //Some code 
    } 
    catch(Exception oops) 
    { 

    } 

之間的區別在我的計劃,我需要捕獲所有異常,我不希望記錄他們。從上面提到的Try-Catch塊,應該使用哪個?

+0

最後一個,我寧願。雖然第一和最後兩個工作。不知道中間;我從未在任何地方見過。 – Zyerah 2013-04-08 08:29:11

+3

[try/catch/throw和try/catch(e)/ throw e之間的差異的可能重複(http://stackoverflow.com/questions/1697216/the-difference-between-try-catch-throw-and -try-catche-throw -e) – 2013-04-08 08:29:13

+0

我希望你不打算只是'吞下'例外...... – 2013-04-08 08:48:34

回答

1

使用不帶參數的catch在框架2.0中不再有用,因爲所有非託管異常都包含在託管異常中。在此之前,您可以使用它來捕獲非託管代碼拋出的異常。

您可以指定例外的只是類型,如果你不希望使用從它的任何信息,但通常你會想它一個名稱,以便您可以得到的信息:

try { 
    // some code 
} catch(Exception) { 
    // i don't care about any information in the Exception object, just the type 
} 

try { 
    // some code 
} catch(Exception ex) { 
    // use some information from the exception: 
    MessageBox.Show("Internal error", ex.Message); 
} 

你應該總是有一個異常類型是越具體越好,因爲這可以更容易地處理異常。然後,您可以添加較少的特定類型來處理其他異常。例如:

try { 
    // some database code 
} catch(SqlException ex) { 
    // something in the database call went wrong 
} catch(Exception ex) { 
    // something else went wrong 
} 
1

到目前爲止,您使用catch (Exception),第一個和第二個是相同的。你在這種情況下抓住了一切。當你想捕捉特定的異常像UnauthorizedAccessException,你必須使用第二個這樣的:

try 
{ 
    //Some code 
} 
catch (UnauthorizedAccessException) 
{ 
    MessageBox.Show(oops.Message); 
} 

在第三種情況下,你可以通過可變oops使用異常。

例如:

try 
{ 
    //Some code 
} 
catch (Exception oops) 
{ 
    MessageBox.Show(oops.Message); 
} 

或與特定的例外:

try 
{ 
    //Some code 
} 
catch (UnauthorizedAccessException oops) 
{ 
    MessageBox.Show(oops.Message); 
} 
+1

第一和第二不是**總是**相同 – LukeHennerley 2013-04-08 08:31:25

+0

你能解釋一下任何例子嗎? – Andy 2013-04-08 08:34:58

+1

是的 - 如果您更改捕捉塊中的異常類型,它將不會捕獲所有異常。您傾向於在最佳代碼實踐中捕獲特定的預期類型的​​例外情況。看到我的答案爲例:) – LukeHennerley 2013-04-08 08:36:19

0

您應該使用最後一個,並以清潔的方式處理您的例外。

第一種方法是相同的,但是「飲食例外」,女巫是最糟糕的事情。

至少記錄你的異常!

+0

說實話,他不應該使用**任何**。這是不好的設計,你應該只捕捉你打算處理的*特定的異常,通常不是一個好主意。 – James 2013-04-08 08:39:00

+0

我認爲你是好人。如果有人來找你,問你「我想砍我的手臂,我該怎麼做?」。你應該回答什麼?是的,我認爲@Kaizen不應該這樣做,但問題不是「這是否是一個好主意」,所以......我們該怎麼做?莫會做什麼? – Thomas 2013-04-08 08:46:05

+0

你給出*技術*的答案,然後以大膽的文字說*你爲什麼*他們不應該。 – James 2013-04-08 10:09:15

0

它們幾乎都是一樣的(我假設第一個是寫第二個的簡寫),與最後一個不同之處在於您將異常對象放入一個變量中,以便您可以在catch中使用它。

通常當我看到這樣的代碼時,我傾向於擔心,因爲它通常是而不是是一個好主意,因爲您可以屏蔽更大的應用程序問題。經驗法則 - 處理你所能做的事情,讓其他所有事情都泡起來。

0

你的第一個和第二個例子是一樣的。他們都會發現任何異常,但沒有任何關於例外的信息。第三個異常將異常存儲在oops中,然後可以使用該異常獲取有關異常的更多信息。

1

通用嘗試捕捉,這將捕獲任何類型的異常

try 
{ 
    //Some code 
} 
catch 
{ 

} 

這將趕上您指定的特定類型的異常,你可以指定多個。

try 
{ 

} 
catch (UnauthorizedAccessException) 
{ 

} 

這將執行與上述相同的操作,但會爲您提供一個可以訪問異常屬性的變量。

try 
{ 

} 
catch (UnauthorizedAccessException ex) 
{ 

} 
0

第三個是最好的...

您可以捕捉任何一種特定的異常,這將是準確的...這有助於確定確切的異常,並容易讓我們改正以及

對於例如:一個可以捕捉DivisionByZeroException,TargetInvocationException,ArrayOutOfBoundException等..

0

我認爲它具有相同的功能 - 要追查錯誤設定/或沒有什麼地方拿錯,

使用的try-catch這樣

> try { 

//some codes 
} 

catch 
{ 
//anything 
//e.g.: 
MessageBox.Show("Something is wrong!"); 
} 

這告訴那有什麼不對,但並沒有表現出詳細的報告。 (隱藏一些錯誤,聰明的辦法是不要放任何東西在catch {} XD,但這不建議這樣做)

接下來就是顯示錯誤

try 
{ 
//some codes 
} 

catch (Exception ex) 
{ 
MessageBox.Show(ex.ToString()); 
} 

希望的詳細報告這有助於! :D