C#中的3个catch块变体之间有什么区别('Catch','Catch(Exception)'和'Catch(Exception e)')?

jor*_*dan 21 c# exception try-catch visual-studio-2010

在C#中,'Catch','Catch(Exception)'和'Catch(Exception e)'之间有什么区别?

关于try-catchMSDN文章在其示例中使用了其中的两篇,但没有解释使用目的的差异.

try
{}
catch 
{}

try 
{}
catch (Exception)
{}

try
{}
catch(Exception e)
{}
Run Code Online (Sandbox Code Playgroud)

这些有何不同?哪些会捕获所有异常,哪些异常捕获?

Eri*_*ert 45

还没有人提到这个问题的历史方面.

在.NET中,抛出一个不是派生的对象是合法的Exception.(它在C#中不合法,但它在其他一些托管语言中.)许多人不知道这个事实,但它是合法的.由于这很疯狂,因此在.NET 2.0中默认值已更改:如果您尝试抛出不是异常的内容,则会自动将其包装在RuntimeWrappedException类中,这显然一个例外.然后扔掉那个对象.

由于这种奇怪的现象,在C#1.0中,通常看到代码同时执行:

try
{ do something }
catch(Exception) 
{ handle the exception }
catch
{ handle the thrown non-exception }
Run Code Online (Sandbox Code Playgroud)

事实上,存在安全性和正确性问题; 在某些情况下,出于安全原因,你必须抓住任何抛出的东西(可能重新抛出它),人们会合理地认为catch(Exception)抓住了一切,但事实并非如此.

幸运的是,自.NET 2.0以来,事情变得更加明智; 如果你需要的话,你可以依靠catch {},catch(Exception) {}catch(Exception ex) {}抓住一切.

最后:如果出于某些疯狂的原因你想要打开C#1.0行为,你可以放

[assembly:System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows = false)]
Run Code Online (Sandbox Code Playgroud)

在你的程序中.


Don*_*ott 24

简而言之...

Catch 没有参数将收到任何异常,但没有办法解决它.

Catch (Exception)基本上会做同样的事情,因为你已经指定了根Exception类型.相反Catch (IOException),只会抓住这种IOException类型.

Catch (Exception ex)捕获所有异常并提供通过ex变量解决它的方法.

阅读更多:http: //msdn.microsoft.com/en-us/library/ms173160.aspx


IAM*_*IAM 9

第一个版本捕获从Exception类派生的所有异常.

第二个版本捕获指定的异常.

第三个版本捕获具有声明名称的指定异常.然后在catch块中,您可以使用此对象,例如,查看完整错误:e.ToString();

在这里阅读更多.


Ren*_*nan 6

所有这些都基本相同,不同之处在于它们提供的有关错误的信息量.

catch (foo ex) {}将过滤掉所有异常,但可以转换为类型的异常除外foo.它还为您提供了错误的实例供您使用.

catch (foo) {}与上面相同,但它没有提供异常的实例.您将知道异常的类型,但无法从中读取信息.

请注意,在这两种情况下,如果异常的类型是Exception,它们将捕获所有异常.

catch {}捕获所有异常.您不知道它捕获的类型,您无法访问该实例.

您可以根据捕获异常所需的信息来选择使用哪一个.

无论您使用哪一个,都可以使用命令throw;(不带参数)向前传递捕获的异常.