您是否了解任何其他错误处理方法而不是try / catch及其变体?

时间:2012-01-23 10:20:29

标签: programming-languages error-handling

我很有兴趣了解除try / catch及其变体之外的编程语言中的其他错误处理方法。

有谁知道这种错误处理的一些有趣案例?

3 个答案:

答案 0 :(得分:3)

嗯,还有很好的旧版

ON ERROR RESUME NEXT

此外,一些编程语言(一些Lisps和Schemes,可能是Smalltalk)将转义中引发异常(即展开堆栈)。也就是说,在某些情况下,可能会在引发异常的情况下处理异常并继续计算---这些异常称为可持续异常

答案 1 :(得分:3)

一般来说,错误处理策略似乎可以分为三类:

  • 什么都不做(ON ERROR RESUME NEXT,如Ryan所说)
  • 在返回代码中指出错误/失败。在某些情况下,这可能是一个额外的输出参数,例如指向错误指示符的指针,该错误指示符在发生错误时设置。
  • 调用备用控制流程。这可能是极端的(调用abort()来阻止程序冷却),或采取异常处理或类似的形式。

备用控制流有许多实现和样式。一种是POSIX信号,通常会导致默认终止程序。 Visual Basic还在ON ERROR GOTO中有一个备用控制流工具。

Perl使用die组合备用控制流和返回码,导致程序终止,在子解释器中,在die'块中运行eval会导致错误代码在调用代码中设置。

然后,当然,还有传统的异常处理,以及Common Lisp的可重启/可恢复异常等变体。甚至信号/ abort()方法和ON ERROR GOTO也可以被认为是原始异常处理系统。因此,广泛地考虑异常,大多数替代控制流错误处理系统可以被认为是某种形式的异常处理。

实际上,实现异常会打开一组有趣的设计空间。语言实现有几种方法可以做到:

  1. 设置标志/异常返回值并返回调用者。 Perl要求您明确执行的操作 - die并检查错误变量$? - 是此方法的手动版本。执行此操作的编程语言使用返回代码错误处理方法来实现异常,并可以通过try-catch构造公开它们; Vala就是一个很好的例子。
  2. 将堆栈(就像返回的函数一样)展开到异常处理程序并运行它。这可以通过VM机器或通过检查堆栈直接完成。它也可以用(2)模拟;当用于实现异常时,这两种方法在语义上几乎相同。
  3. 在抛出错误的代码的动态范围内调用异常处理代码。这就是Common Lisp对其condition-case构造所做的事情 - 错误处理程序在不展开堆栈的情况下运行,然后指示是通过重试还是通过展开来处理错误。
  4. 使用double-barrelled continuation passing。在正常的连续传递样式(CPS)中,函数不是返回值,而是调用另一个函数(称为延续),该函数由其调用者作为其参数之一提供,其结果是“继续”计算。在双管CPS中,调用者提供两个延续:一个用于正常结果,一个用于错误。这可以用来实现与(1)和(2)相同的语义,但是这是一个有趣的替代策略,可以为构建更有趣的语义提供机会。
  5. 因此,总结一下:有三种基本方法:忽略错误,返回代码和各种类似异常的工具。但是在类似异常的工具的空间内,语义或接口以及实现这些语义都有多种选择。

答案 2 :(得分:2)

有很好的旧回报价值。 GO实际上使用了返回值而不是异常。 由于C没有异常机制,它也使用返回值,加上一个全局变量(errno)。

编辑我的GO信息似乎已过时,因为它现在有一个异常处理机制。不过,返回值可用于报告错误。