24

什么是 C# 等价于 Java 的Throwable

在 Java 中,异常类层次结构的根称为Throwable而不是 Exception。这Throwable类有两个派生类:

Exception:对于合理的应用程序可能想要捕获的条件。

Error:对于一个合理的程序不应该试图捕捉的严重问题。

所以Throwable基类包含一个合理的程序不应该试图捕捉的问题。

4

2 回答 2

22

那将是Exception 类。除了 .NET 中的异常之外,没有单独的“可抛出”概念。

于 2013-07-03T19:31:14.840 回答
1

.Net 允许任何类的异常,但 C# 将 throw 和 catch 限制为 Exception。使用既不指定类型也不指定变量的 catch 子句来捕获非 Exception 异常。

相关规范片段:

当 catch 子句指定类类型时,该类型必须是 System.Exception、派生自 System.Exception 的类型或以 System.Exception(或其子类)作为其有效基类的类型参数类型。

当 catch 子句同时指定类类型和标识符时,将声明给定名称和类型的异常变量。异常变量对应于一个局部变量,其范围延伸到 catch 块上。在 catch 块执行期间,异常变量表示当前正在处理的异常。出于明确分配检查的目的,异常变量被认为是在其整个范围内明确分配的。

除非 catch 子句包含异常变量名称,否则无法访问 catch 块中的异常对象。

既不指定异常类型也不指定异常变量名称的 catch 子句称为通用 catch 子句。一条 try 语句只能有一个通用 catch 子句,如果有,它必须是最后一个 catch 子句。

某些编程语言可能支持无法表示为派生自 System.Exception 的对象的异常,尽管 C# 代码永远不会生成此类异常。通用的 catch 子句可用于捕获此类异常。因此,一般的 catch 子句在语义上与指定类型 System.Exception 的子句不同,因为前者也可以捕获来自其他语言的异常。

.Net 4.0 引入了一个类似于 Java 的 Error 类的概念。虽然损坏状态异常扩展了异常,但只有具有HandleProcessCorruptedStateExceptionsAttribute的方法才能捕获 CSE。

于 2014-09-28T13:22:24.133 回答