c# – 为什么必须从System.Exception引发或捕获类型 - 代码日志

c# – 为什么必须从System.Exception引发或捕获类型

所以出于好奇,我想看看异常类是什么特别的,允许它在标准类不使用时使用关键字Throw。

所有我发现的是Exception类实现了以下

public class Exception : System.Object, System.Runtime.Serialization.ISerializable, System.Runtime.InteropServices._Exception
{
}

所以我尝试实现这些相同的接口,并试图抛出我自己的定制异常,没有派生自System.Exception无效。我只是被告知

The type caught or thrown must be derived from System.Exception

那么有什么具体的理由呢?我认为管理型语言的选择似乎是随意的。

我认为你的前提是错误的。有可能抛出不是从System.Exception派生的对象。你不能把它抛到C#中,或者检查一个catch子句中的对象。从C#spec(v4.0)的8.10节:

Some programming languages may support exceptions that are not
representable as an object derived from System.Exception, although
such exceptions could never be generated by C# code. A general catch
clause may be used to catch such exceptions. Thus, a general catch
clause is semantically different from one that specifies the type
System.Exception, in that the former may also catch exceptions from
other languages.

一般的例子:

try
{
}
catch (Exception) { } // 'specific' catch
catch { } // 'general' catch

特别地,这在调用非托管代码时非常重要。

有些类型似乎总是在每种语言中得到特殊待遇。主要是因为它们对于系统是至关重要的。 System.Exception,System.ValueType,System.Delegate都是C#中紧密绑定到语言关键字和CLR的特殊类型,因此您不能仅仅实现接管角色的类,这并不奇怪。

http://stackoverflow.com/questions/12613805/why-must-a-type-thrown-or-caught-derive-from-system-exception

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 为什么必须从System.Exception引发或捕获类型