2011-12-20 58 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) { } 
相关问题