catch(异常),catch()和catch之间的区别

Cle*_*der 13 .net exception-handling

我想知道我是否可以安全地编写catch()来捕获所有System.Exception类型.或者我必须坚持捕捉(例外)来实现这一目标.我知道其他异常类型(例如InvalidCastException),我必须将类型指定为catch(InvalidCastException).换句话说,我问的是以下代码示例是否相同.

这个 ...

try
{
    //do something
}
catch(Exception)
{
    //handle exception
}
Run Code Online (Sandbox Code Playgroud)

这个 ...

try
{
    //do something
}
catch() //Causes compile time error "A class type expected"
{
    //handle exception
}
Run Code Online (Sandbox Code Playgroud)

还有这个 ...

try
{
    //do something
}
catch
{
    //handle exception
}
Run Code Online (Sandbox Code Playgroud)

更新:我的问题出错了.catch()在c#中是不允许的.

ken*_*n2k 14

在一个完美的世界中,你不应该使用catch(Exception)也不要catch(单独),因为你永远不应该捕获一般Exception异常.你总是应该捕获更具体的异常(例如InvalidOperationException......等).

在现实世界中,两者catch(Exception)catch(单独)都是等价的.我建议catch(Exception ex)在计划仅重用异常变量时使用,catch在其他情况下(单独)重复使用.只是第二个用例的风格问题,但如果亲自发现它更简单.

真正重要的是(即使它超出了你的问题的范围),你永远不会写下面这段代码:

try
{
}
catch (SpecificException ex)
{
    throw ex;
}
Run Code Online (Sandbox Code Playgroud)

这会将堆栈跟踪重置为抛出点.另一方面:

try
{
}
catch (SpecificException)
{
    throw;
}
Run Code Online (Sandbox Code Playgroud)

保持原始堆栈跟踪.


Fré*_*idi 6

两种结构(catch ()作为语法错误,如sh4nx0r正确指出)在C#中表现相同.两者都被允许的事实可能是从C++语法继承的语言.

其他语言(包括C++/CLI)可以使用throw非派生的对象System.Exception.在这些语言中,catch将处理那些非CLS异常,但catch (Exception)不会.