try {
}
catch (Exception) {
}
我可以写吗?
try {
}
catch {
}
在C#.NET 3.5中可以。代码看起来更好但我不知道是否相同。
答案 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
类继承。