以下 catch 块有什么区别?
try
{
...
}
catch
{
...
}
and
try
{
...
}
catch(Exception)
{
...
}
我意识到,在任何一种情况下,异常实例都不可用,但是我可以用一个实例做一些其他实例做不到的事情吗?
他们是almost相同。
来自 C# 语言规范,第 8.10 节:
某些编程语言可能支持不能表示为从 System.Exception 派生的对象的异常,尽管 C# 代码永远无法生成此类异常。通用的 catch 子句可用于捕获此类异常。因此,一般的 catch 子句在语义上与指定 System.Exception 类型的子句不同,因为前者还可以捕获来自其他语言的异常。
请注意,虽然 C# 区分了两者,但它们实际上与 .NET 2.0 相同,如这个博客 http://blogs.msdn.com/b/jmanning/archive/2005/09/16/469091.aspx:
感谢 2.0 CLR 最近的更改,如果您的代码决定在某个地方抛出一个 int (System.Int32),CLR 现在将用 RuntimeWrappedException 来包装它,并且编译器已更新为您提供该信息警告上面的第二个子句现在是死代码
warning CS1058: A previous catch clause already catches all exceptions. All non-exceptions thrown will be wrapped in a System.Runtime.CompilerServices.RuntimeWrappedException
对于 CLR 如何知道为您的程序集执行此操作,您会注意到编译器现在向您的程序集添加一个 RuntimeCompatibilityAttribute 告诉它:
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = {property bool 'WrapNonExceptionThrows' = bool(true)}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)