我使用以下代码:
catch (Exception ex) {
processException(ex);
return View("CreateEdit", vm);
}
是否有必要声明异常“Exception ex”。我想知道是否有阻塞 在随后的括号中有任何与某事无关的东西 派生自异常?
答案 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) { }