Closed. This question is
opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便
editing this post用事实和引用来回答。
5年前关闭。
Improve this question
初步说明:
此问题无意于在.NET上抨击,也无意引发“致命异常”之类的讨论战争-Java的设计师
clearly thought there are ,. NET设计师要么以为是,否则就不知道了。 ,或者可能有另一个(技术上的)原因使异常层次结构保持现状。
我最感兴趣的是任何MS设计师是否都有设计文档或声明,为什么.NET层次结构就是今天的样子。大胆的猜测和猜测将得出错误的答案。内在的争论/示例为什么没有这样的东西(可分类的)
Fatal Exception当然可以做出有效的答案,尽管我一定不同意它们。但是,与评论相反,我保证不会与任何内在的答案争论;-)另一类答案可能表明有证据表明Java的
Error
类型分类是一个坏主意/实际上在Java中不起作用,从而隐式显示了.NET为什么不需要它。 :-)
在努力成为经验丰富的C#程序员的过程中,我注意到
.NET exception hierarchy中一些我认为很奇怪的东西(*):
所有引发类型的基类为
Exception
(
well, basically anyway)。
具体来说,许多异常直接从
Exception
派生而来的
categorization到
SystemException
->等,似乎有点毫无意义。
例如,对我来说尤其奇怪的是,当
SEHException
是-a
ExternalExpection
是-a
SystemException
时,它实际上似乎更像是一种崩溃和烧伤的错误。
虽然在Java方面没有过分的经验,但我发现Java在wrt方面与众不同。
Error
type与“正常”
Exception
很有道理。当然可以争论细节,但是
.NET
/ C#甚至不尝试这种方法似乎很奇怪。
C#知名度的Eric Lippert有一个
nice piece on categorizing exceptions,我对此大为认同,这让我感到更加奇怪,为什么.NET甚至没有尝试为“致命异常”提供存储桶。
通过“致命异常”,我基本上暗示了利珀特先生描述的相同概念:
致命异常不是您的错,您无法阻止它们,并且您
无法理智地清除它们。 ...
注意:最重要的是,它们很可能(尤其是不是)您引发异常的操作错误。
...他们几乎总是会发生,因为
这个过程深陷疾病,即将被淘汰
苦难。内存不足,线程中止等等。绝对有
捕获这些毫无意义,因为您微不足道的用户代码无能为力
将解决问题。只要让您的“最终”障碍运行起来,并希望
最好的。 (或者,如果您真的很担心,请快速失败,不要让
最终块运行;在这一点上,它们可能会使情况变得更糟。
但这是另一天的话题。)
我将注意到,从技术上讲,某些致命异常与其他任何异常一样完全可以。您应该能够在适当的时间捕获它-只是对于99%的代码根本不适合处理这些。
以Lipperts先生为例:说我调用一个函数来打开一个文件,该文件可能引发各种异常。如果发现其中任何一个,我要做的就是报告打开文件失败的原因X,并继续进行适当的操作。但是,如果打开文件引发了ThreadAbortedException,则报告任何内容都没有意义,因为文件打开操作没有失败,但是某些代码中止了当前线程并在与假设的FileNotFoundException相同的情况下进行了处理。在绝大多数情况下都是有意义的。
评论者似乎认为,只有捕获站点才能真正判断某些东西是否“致命”,并且没有适当的事先分类,但是我强烈怀疑有一个很好的例外列表,其中99%的用户代码从不希望捕获:
拿
StackOverflowException
(而且我敢肯定还有更多),它“只是”一个常规的SystemException,被认为是致命的:
在.NET Framework 1.0和1.1中,您可以捕获
StackOverflowException对象(例如,从无界恢复
递归)。从.NET Framework 2.0开始,您将无法
带有try / catch块的StackOverflowException对象,以及
默认情况下终止相应的进程。
请注意,我认为致命的异常不必立即终止应用程序(相反)。我要问的是,当设计人员显然确实认为某些异常比其他异常致命时,.NET框架为什么不尝试在异常的层次结构中表示“致命性”。
(*)“考虑相当奇怪”实际上意味着我个人,在时间连续体的这一点上,找到了.NET异常层次结构
totally botched。