繁体   English   中英

在.NET中检查和取消选中的异常

[英]checked and unchecked exception in .NET

当我在阅读APUE(UNIX环境中的高级编程)时,一个奇怪的想法来到我身边。

似乎在UNIX的错误处理中,有两种类型的错误(FATAL和INFATAL)。 我觉得这与JAVA中的已检查和未经检查的异常有关。

因此,总而言之,在一个程序中,您有两种错误,其中一种是关键的,会导致系统崩溃,而您却无能为力。 另一个更像是一个信号,你可以抓住并做一些事情来解决它。

我听说在C#中没有检查和未检查的异常,因此C#没有关键和非关键错误的概念吗? 只是非常好奇,因为我认为这个概念非常基础。

更新:其他语言的例外设计是什么? 任何人都可以谈论这个吗?

在Java中,已检查和未检查的异常并不完全映射到致命或非致命错误。 显式检查异常明确表示可能抛出异常并且有人必须捕获它(尝试处理它或将其抛出堆栈),但不能保证错误可能不是致命的(即语法中的语法错误) SQL查询将抛出一个SQLException并且可能是致命的,但它是一个经过检查的异常)。 未经检查的异常仅表示某人不需要捕获它,但如果您愿意,您仍然可以。 它通常表示编程错误。 Java错误通常表示不可恢复的问题(例如OutOfMemoryError)。

未经检查的异常的C#设计意味着您不需要捕获异常,如果未被捕获将使应用程序崩溃。 检查与未检查的异常一直是开发社区长期存在的争论,两者都有利有弊。 但通常情况下,您无法对异常执行某些操作,并且它经常最终会被记录而不是处理,因此C#会将异常取消选中。 当您可以处理它们时(例如,如果您想重试IO操作),您仍然可以捕获它们并重试。

在我之前不再使用的系统中,我在.NET中创建了2级(致命和非致命)异常系统 - 主要是通过从Exception类继承到另外两个基类( FatalExceptionNonFatalException )和然后从这两个派生更进一步,更具体的Exception类。 我不再以这种方式工作的事实表明我不再觉得这是必要的 - 它只是增加了系统的仪式而没有增加太多价值。

在[CriticalException]与[NonCriticalException]之类的异常类属性中构建的IMHO ac#编译器会很好。 如果使用此属性或(.NET运行时中的MS)装饰异常类,如果在调用图中的某处找不到catch-block,编译器会给出警告,假设在调用图中这个特定的异常被扔了。

是的,有这样的关键例外。 例如,从框架的2.0版开始,无法在try-catch块中捕获StackOverflowException

在C#中有一些特殊的异常,你无法真正从中恢复(我认为它们都与内存问题有关) - 但它们都是系统异常,你无法创建新的异常。

没有任何机制可以强制程序员像Java一样捕获(或声明throws ) - 所有异常都将归类为未选中。 显然你仍然可以捕获它们并恢复,但编译器不会帮助你解决这个问题。

在C#中,您还可以在应用程序级别捕获未处理的异常。 这些将被捕获为错误(页面错误,应用程序错误),而不是异常,但您可以访问最后一个异常,以便至少可以记录它们。 此时,您不再可以选择修复和重试,但日志记录至关重要,因为您的应用程序已经关闭。

不知道Java或Unix中的等效最后一个等价物是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM