【问题标题】:checked and unchecked exception in .NET.NET 中的已检查和未检查异常
【发布时间】:2010-09-21 15:29:32
【问题描述】:

我在阅读 APUE(UNIX 环境中的高级编程)时突然想到一个奇怪的想法。

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

所以,总而言之,在一个程序中,你有两种错误,其中一种是严重的,会导致系统崩溃,你对此无能为力。另一个更像是一个信号,你可以捕捉到它并做一些事情来修复它。

听说C#中没有checked和unchecked exception,那么C#是不是没有关键错误和非关键错误的概念呢?只是很好奇,因为我认为这个概念非常基础。

更新:其他语言的异常设计是什么?谁能谈谈这个?

【问题讨论】:

  • 选中与未选中与致命与非致命正交。

标签: c# java .net c unix


【解决方案1】:

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

未经检查的异常的 C# 设计只是意味着您不需要捕获异常,如果未捕获将导致应用程序崩溃。 Checked vs unchecked exceptions 一直是开发社区中长期存在的争论,两者各有利弊。但是,通常情况下,您不能对异常做任何事情,而且它经常只是被记录而不是被处理,因此 C# 使异常未经检查。当你可以处理它们时(例如,如果你想重试一个 IO 操作),你仍然可以捕获它们并重试。

【讨论】:

  • 不太对。在 Java 中,您必须 处理已检查的异常,方法是使用 catch 处理它或明确声明该方法允许将其抛出堆栈。
  • @JeremyP,这就是我的意思,但我会更新帖子以澄清文字。
  • 检查异常可能对小型项目有帮助,但对大型项目来说是个坏主意。
  • @sirmak,我不认为这是一个公平的笼统声明。已检查和未检查的异常都可以有自己的位置,虽然我倾向于未检查,但我认为这与项目的大小没有必然关系。
  • @sirmak,我不同意它们在大型项目中可能会出现问题。它们也可能在小型项目中成为问题。
【解决方案2】:

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

【讨论】:

  • 完全同意 - 在大多数情况下(除了 OutOfMemory 和 StackOverflow 之外的几乎所有情况)应该由调用代码来决定异常是否致命!
【解决方案3】:

恕我直言,内置异常类属性的 c# 编译器,如 [CriticalException] 与 [NonCriticalException] 会很好。如果您使用此属性或(.NET 运行时中的 MS)装饰您的异常类,如果在调用图中的某处找不到 catch 块,编译器会给您一个警告,假设在调用图中此特定异常被抛出。

【讨论】:

    【解决方案4】:

    是的,有这样的严重例外。例如,从 2.0 版开始,StackOverflowException 无法在 try-catch 块中被捕获

    【讨论】:

      【解决方案5】:

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

      没有像 Java 中那样强制程序员捕获(或声明 throws)的机制 - 所有异常都将被归类为未检查。显然你仍然可以捕获它们并恢复,但编译器不会帮助你。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多