空的try/catch是否等于捕获Exception?

sen*_*ale 30 .net c#

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

我能写吗?

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

这在C#.NET 3.5中是否正常.代码看起来更好,但我不知道是否相同.

Rei*_*aka 30

他们一样.

catch(Exception){}仅捕获托管异常; catch {}也会捕获非CLS异常:http://msdn.microsoft.com/en-gb/bb264489.aspx

当在catch块中删除先前允许的权限时,未处理的非CLS兼容异常会成为安全问题.由于未捕获到非CLS兼容的异常,因此抛出非CLS兼容异常的恶意方法可能会以提升的权限运行.

编辑:结果.NET 2.0+包装值 - 所以它们相同的.这有点令人宽慰!

  • 这仅适用于C#2.0之前 (2认同)

Jus*_*ier 13

是的,第一种形式的优点是您可以命名异常变量,然后使用该对象将异常详细信息记录到文件等...

try {
}
catch (Exception ex) {
  // Log exception message here...
}
Run Code Online (Sandbox Code Playgroud)

此外,Exception如果您可以使用第一个表单捕获特定异常(例如IOException),那么捕获泛型类通常是一种不好的做法.

  • 这是不正确的 - 第一个将捕获所有符合CLS的异常,第二个也将捕获非符合CLS的异常. (6认同)

Tra*_*man 12

编辑:从C#2.0开始,可以通过两种方式捕获非CLS兼容的异常.

所以,是的.它们完全相同. 没有Type声明的无参数catch子句捕获所有异常.

在CLR 2.0中,MS引入了RuntimeWrappedException,它是一种符合CLS的异常类型,用于封装非CLS兼容的异常.C#编译器仍然不允许你抛出它们,但它可以使用catch(Exception){}语法捕获它们.

这就是为什么如果在CLR 2.0或更高版本上同时使用这两个子句,C#编译器将发出警告CS1058.

因此,它们实际上是相同的.