C#中与Java的Throwable相当的是什么?

26

C#中与Java的Throwable等效的是什么?

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

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

Error: 对于合理的程序不应尝试捕获的严重问题。

因此,Throwable基类包括一些合理的程序不应该尝试捕获的问题。


1
@tieTYT 猜测人们认为这是容易查找的东西? - Daniel
2
@Daniel 我明白了。我不知道那是可以被踩的行为。 - Daniel Kaplan
5
我认为这个问题并不像投票结果所示的那样糟糕 - Java有一个独立的Throwable类,与其Exception类不同,这在C#中没有直接对应的内容。在期望某些东西存在的情况下,“查找”不存在的内容并不总是简单的事情... - Reed Copsey
1
没有对问题进行投票(看起来也很有用)- 添加一两行解释/展示throwable的含义/用途可能会使其更好。 - Alexei Levenkov
3
@tieTYT,下降提示框显示“没有展示任何研究努力”。 - Daniel
2个回答

22

这将是 Exception 类。在 .NET 中,除了异常之外没有单独的 "throwable" 概念。


你不能投票,因为你不知道“throwable”是什么意思 - 真遗憾。在C++/CLI中,难道你不能抛出任何想要的东西吗?我认为“Exception”限制只适用于符合公共语言规范的代码,而不是一般的.Net... - Alexei Levenkov
@AlexeiLevenkov 我不相信C++/CLI允许这样做 - CLR将允许您抛出任何对象,但CLS要求对象派生自“Exception”。我不认为任何当前的语言(我见过的)允许您抛出非异常,除了null。 - Reed Copsey
搜索了一下,MSDN说可以,即在String (C++ Component Extensions)中。我不确定它内部实际上是如何工作的...也许它确实将其转换为/从异常。 - Alexei Levenkov
@AlexeiLevenkov 我认为这是用于本地异常处理支持的 - 不过我不确定。 - Reed Copsey

2
.Net允许任何类的异常,但C#只限制在Exception中使用throw和catch。使用一个不指定类型或变量的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 的 catch 子句不同,前者还可以捕获其他语言的异常。

.Net 4.0引入了类似于Java的Error类的概念。虽然Corrupted State Exceptions扩展了Exception,但只有使用HandleProcessCorruptedStateExceptionsAttribute方法才能捕获CSEs。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接