因此,出于好奇,我想看看异常类有什么特别之处,允许它与关键字一起使用Throw
而标准课程则不然。
我发现的是 Exception 类实现了以下内容
public class Exception : System.Object, System.Runtime.Serialization.ISerializable, System.Runtime.InteropServices._Exception
{
}
因此,我尝试实现这些相同的接口,并尝试抛出我自己的自定义异常,该异常不是派生自System.Exception
无济于事。我只是被告知
捕获或抛出的类型必须源自System.Exception
那么这其中有什么具体原因吗?我认为托管语言中的选择似乎是任意的。
我认为你的前提是错误的。抛出的对象可能不是派生自System.Exception
。您只是不能将其放入 C# 中或在 catch 子句中检查该对象。来自 C# 规范 (v4.0) 的第 8.10 节:
某些编程语言可能支持不支持的异常
可表示为派生自 System.Exception 的对象,尽管
C# 代码永远不会生成此类异常。一般捕获
子句可用于捕获此类异常。因此,一般捕获
子句在语义上与指定类型的子句不同
System.Exception,因为前者也可能捕获来自
其他语言。
一般捕获的示例:
try
{
}
catch (Exception) { } // 'specific' catch
catch { } // 'general' catch
特别是,这在调用非托管代码时非常重要。
有些类型似乎在每种语言中都受到特殊对待。主要是因为它们对于系统来说是如此基础。System.Exception
, System.ValueType
, System.Delegate
都是 C# 中与语言关键字和 CLR 紧密绑定的特殊类型,因此您不能只实现接管其角色的类也就不足为奇了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)