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

时间:2010-08-02 21:06:49

标签: c# .net

try {
}
catch (Exception) {
}
我可以写

吗?
try {
}
catch {
}

在C#.NET 3.5中可以。代码看起来更好但我不知道是否相同。

8 个答案:

答案 0 :(得分:30)

他们相同。

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

  

未处理的非CLS兼容   异常成为安全问题   以前允许的权限   在catch块中删除。   因为非CLS兼容的例外   不被抓住,是一种恶意的方法   抛出非CLS兼容   异常可能会升高   权限。

编辑:结果是.NET 2.0+包含了值 - 因此它们 相同。这有点令人宽慰!

答案 1 :(得分:13)

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

try {
}
catch (Exception ex) {
  // Log exception message here...
}

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

答案 2 :(得分:12)

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

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

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

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

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

答案 3 :(得分:1)

它是一样的,但是如果你在第一个例子中放置了一个e之后的e,那么你就知道抛出了什么异常......

编辑:你永远不应该捕获异常,你怎么知道如何正确处理它?<​​/ p>

答案 4 :(得分:1)

我想除非你想在某种形式下使用Exception,否则第二个就完全没问题了。虽然为了在第一个中使用异常,你需要声明一个像这样的变量

try {
}
catch (Exception e) {
//do something with e
}

答案 5 :(得分:0)

您的两个示例都显示为您没有对异常数据执行任何操作。这通常不是一个好习惯。 但两者完全相同,因为所有异常类都派生自System.Exception

您应该考虑进行某种类型的日志记录,然后重新抛出原始异常,或将其包装在应用程序可以理解的更专业的异常中。

try
{
    // Some code here
}
catch(Exception ex)
{
    // Do some logging
    throw;
}

OR

try
{
    // Some code here
}
catch(Exception ex)
{
    // Do some logging
    // wrap your exception in some custom exception
    throw new CustomException("Some custom error message, ex); 
}

您通常应该只捕获代码可以处理的异常,否则它应该冒泡并最终应该被全局异常处理程序捕获,假设您有一个。

答案 6 :(得分:0)

如上所述,它们有所不同:

  

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

您可以看到IL生成的差异:

//no (Exception)
.try L_0001 to L_0005 catch object handler L_0005 to L_000a

//with (Exception)
.try L_0001 to L_0005 catch [mscorlib]System.Exception handler L_0005 to L_000a

答案 7 :(得分:-2)

参数less构造函数将导致处理来自其他语言的异常类型,异常不会从c#SYSTEM.EXCEPTION类继承。