在UNIX的错误处理中,似乎有两种类型的错误(FATAL和INFATAL)。我觉得这与JAVA中的已检查和未经检查的异常有关。
所以,总而言之,在一个程序中,你有两种错误,其中一种是关键的,会导致系统崩溃,你无能为力。另一个更像是一个信号,你可以抓住并做一些事情来解决它。
我听说在C#中没有检查和未检查的异常,因此C#没有关键和非关键错误的概念吗?只是非常好奇,因为我认为这个概念非常基础。
更新:其他语言的例外设计是什么?有谁可以谈论这个?
答案 0 :(得分:8)
在Java中,已检查和未检查的异常并不完全映射到致命或非致命错误。显式检查异常明确表示可能抛出异常并且有人必须捕获它(尝试处理它或将其抛出堆栈),但不能保证错误可能不是致命的(即语法中的语法错误) SQL查询将抛出一个SQLException并且可能是致命的,但它是一个经过检查的异常)。未经检查的异常仅表示某人不需要捕获它,但如果您愿意,您仍然可以。它通常表示编程错误。 Java错误通常表示不可恢复的问题(例如OutOfMemoryError)。
未经检查的异常的C#设计意味着您不需要捕获异常,如果未被捕获将导致应用程序崩溃。检查与未检查的异常一直是开发社区长期存在的争论,两者都有利有弊。但通常情况下,您无法对异常执行某些操作,并且它经常最终会被记录而不是处理,因此C#会将异常取消选中。当您可以处理它们时(例如,如果您想重试IO操作),您仍然可以捕获它们并重试。
答案 1 :(得分:2)
在以前我不再使用的系统中,我在.NET中创建了2级(致命和非致命)异常系统 - 主要是通过从Exception
类继承到另外两个基础类(FatalException
和NonFatalException
)然后从这两个类派生更多,更具体的Exception
类。
我不再以这种方式工作的事实表明我不再觉得这是必要的 - 它只是加入了系统的仪式而没有增加太多价值。
答案 2 :(得分:2)
IMHO在[CriticalException]与[NonCriticalException]之类的异常类属性中构建的c#编译器会很好。如果使用此属性或(.NET运行时中的MS)装饰异常类,如果在调用图中的某处找不到catch-block,编译器会给出警告,假设在调用图中这个特定的异常扔了。
答案 3 :(得分:1)
是的,有这样的关键例外。例如,从框架的2.0版开始,StackOverflowException
无法在try-catch块中捕获
答案 4 :(得分:0)
在C#中有一些特殊的异常,你无法真正从中恢复(我认为它们都与内存问题有关) - 但它们都是系统异常,你无法创建新的异常。
没有机制强制程序员像Java一样捕获(或声明throws
) - 所有异常都将归类为未选中。显然你仍然可以捕获并恢复,但编译器不会帮助你解决这个问题。
答案 5 :(得分:0)
在C#中,您还可以在应用程序级别捕获未处理的异常。这些将被捕获为错误(页面错误,应用程序错误),而不是异常,但您可以访问最后一个异常,以便至少可以记录它们。此时,您不再可以选择修复和重试,但日志记录至关重要,因为您的应用程序已经关闭。
不知道Java或Unix中的等效最后一个等价物是什么。