什么进入捕获的?

时间:2011-12-20 04:13:30

标签: c# .net exception exception-handling try-catch

我使用以下代码:

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

是否有必要声明异常“Exception ex”。我想知道是否有阻塞 在随后的括号中有任何与某事无关的东西 派生自异常?

4 个答案:

答案 0 :(得分:2)

在catch块中,您必须提供要捕获的异常类型。所有这些类型都必须来自班级System.Exception

最好不要直接捕获Exception类型的异常,而是捕获特定的异常。处理System.Exception(如果存在)的catch块最后指定。

http://msdn.microsoft.com/en-us/library/ms229007.aspx

http://msdn.microsoft.com/en-us/library/system.exception.aspx

答案 1 :(得分: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 :(得分:2)

在C#中,当您捕获特定类型的某些内容时,它必须是Exception或从Exception派生的类型。其他.NET语言(例如C ++ / CLI)支持抛出非Exception类型,捕获它们的唯一方法是使用“空捕获”,即catch { ... } - 但这只是有用的在非常罕见的情况下(主要是与其他图书馆互操作时)。

答案 3 :(得分:1)

不,这不是强制性的。在catch块中,您将声明一个System.Exception类的对象,该对象包含引发的异常的详细信息。

您可以声明自己想要的方式,因为它只是使用Exception Ex的惯例。括号中的类是捕获的异常类型。如果您不使用括号,则使用throw语句抛出异常。

例如,这些都是有效的:

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