为什么一定要一个类型抛出或捕获从System.Exception派生(Why must a type

2019-07-31 23:56发布

所以只是出于好奇,我想看看什么特殊之处,允许它与关键字一起使用的异常类Throw ,而标准的类是没有的。

我所发现的是,异常类实现了以下

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

所以,我想实现这些相同的接口,并试图抛出没有从派生自己的自定义异常System.Exception无济于事。 我只是告知

捕获或抛出的类型必须从派生System.Exception

那么,有没有这方面的任何具体的原因是什么? 我假设有在托管语言几个选择似乎是任意的。

Answer 1:

我觉得你的前提是错误的。 这可能是一个对象被抛出未来源于System.Exception 。 你不能把它在C#或检查catch子句的对象。 从C#规范(V4.0)第8.10:

有些编程语言可能支持不能表示为从System.Exception派生的对象例外,尽管这种异常不可能由C#代码生成。 一般的catch子句可以用来捕捉这些异常。 因此,一般的catch子句是从一个指定System.Exception类型,因为前者还可以捕获来自其他语言的异常语义不同。

一般捕的例子:

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

尤其是在调用非托管代码时,这是非常重要的。

某些类型似乎总是在每一种语言特殊处理。 这主要是因为他们是如此重要的系统。 System.ExceptionSystem.ValueTypeSystem.Delegate都是特殊类型在C#中被紧密结合语言的关键字和CLR,所以这并不奇怪,你不能只是实现一个接管他们的角色类。



Answer 2:

例外设计指南

例外的是报告错误的标准机制。 应用程序和库不应使用返回代码通信错误。 异常的使用增加了一个一致的框架设计,并允许误差的成员,如构造函数报告,不能有返回类型

扔(C#参考)

被抛出的异常是一个对象,其类从System.Exception衍生,如示于下面的例子。

class MyException : System.Exception {}
// ...
throw new MyException();

异常概述

在.NET框架中,一个例外是,从异常类继承的对象

所以,你的异常必须派生自System.Exception ,但它是你的,你怎么组织内它。



Answer 3:

这是CLS的设计师任意选择。 想必他们做出了这个选择一致性原因。 C#如下CLS; 要求由编译器为此强制执行,而不是相关的异常类型的实现技术原因。

该CLI居然可以抛出任何对象。 见http://jilc.sourceforge.net/ecma_p3_cil.shtml#_Toc524462405 。



Answer 4:

在语言使用System.Exception作为所有异常的基。 这基本上意味着,任何抛出或开捕例外不应该错误,如果你这样做(Exception)myExc 。 这可能是因为该定义System.Exception类是用来让所有的异常遵循相同的接口。 由于一致的接口,例外到达用栈跟踪和有意义的消息(例如),这是非常宝贵的,以便记录。



Answer 5:

为什么每一个例外都需要有一个通用的基类的一个原因是这样你就可以赶上一个catch块每一个类型的异常。

如果我有这样的:

try
{
    ...
}
catch(Exception ex)
{
    // Handle somehow
}

这将捕获所有异常,并允许我以显示它是什么(通过使用ex.Message )。

如果你能扔东西 ,那么你将如何有一个catch将捕获一切,仍然给你的对象访问抛出?

你可以有这个,这将赶上绝对一切:

try
{
    ...
}
catch
{
    // Handle somehow
}

但是,你有“丢失”抛出的东西。



文章来源: Why must a type thrown or caught derive from System.Exception