2011-12-20 59 views
1

我使用下面的代碼:什麼進入()捕獲?

catch (Exception ex) { 
    processException(ex); 
    return View("CreateEdit", vm); 
} 

是否有必要聲明異常「異常前」。我想知道是否有一個catch塊 有任何在後面的括號中,與異常派生的東西 無關?

+0

如下問題的答案表明,好字捕捉異常的類型(類)是強制性的。但是,聲明該類型的*變量*是可選的。如果你想使用'catch'塊中的異常對象,你只需要這樣做。否則,你可以簡單地寫'catch(Exception)'或甚至更好,處理一個特定的更多派生異常,'catch(FileNotFoundException)'。 – 2011-12-20 04:41:10

回答

2

否;它必須始終是一個類型爲Exception的參數或從其派生的東西。

該部分指定在catch塊中捕獲哪種類型的異常及其派生類。例如,考慮:

try 
{ 
    //stuff... 
} 
catch (DivideByZeroException ex) 
{ 
    //do stuff with divide by zero... 
} 
catch (MyCustomException ex) 
{ 
    //do stuff with my custom exception... 
} 
catch (IOException ex) 
{ 
    //do stuff with IO Exception... 
} 
catch (Exception ex) 
{ 
    //handle all other exceptions 
} 

catch條款的順序是至關重要的,如果有多個。他們必須始終從大多數派生到最少;如果我將最後一個塊Exception置於頂部,它將捕獲所有異常,而其他更多派生塊將不會捕獲任何內容。

也可以忽略最通用的Exception,以便讓其他類型的異常將堆棧升級到新的級別。

2

在C#中,當您捕捉某種特定類型的東西時,它必須是Exception或從Exception派生的類型。其他.NET語言(例如C++/CLI)支持拋出非Exception類型,並且捕獲這些類型的唯一方法是使用「空捕獲」,即catch { ... } - 但這僅在非常罕見的情況下才有用與其他圖書館互操作)。

1

不,它不是強制性的。在catch塊中,聲明瞭一個System.Exception類的對象,該類包含引發的異常的詳細信息。

你可以聲明你的想法,因爲它只是約定使用Exception Ex。括號中的類是捕獲的異常的類型。如果您不使用括號,那麼您使用throw聲明拋出異常。

例如,這些都是有效的:

catch (Exception ex) { } 
catch (Exception e) { } 
catch (Exception objEx) { }