ada - 在Ada中使用异常(exception)

标签 ada

我正在寻找样式指导。在Python中,异常用作“常规”操作:

try:
    z = x/y
except ZeroDivisionError:
    z = 73.0    # set z if y is zero
而不是检查y接近零,我们进行除法并捕获异常。
John Barnes在“Ada 2012编程”中的Ada中说明了这种方法:
begin
    Tomorrow := Day'Succ(Today);
exception
    when Constraint_Error =>
        Tomorrow := Day'First;
但是,接着,这本书继续说:“这是一个非常糟糕的例子。对于很少发生的情况,应使用异常(exception)……”。
我是Ada的新手,像在Python中一样,使用异常来避免if语句是否是一种很好的Ada编程风格?还是真的在Ada中使用异常来处理讨厌的事情?

最佳答案

与Python的主要区别在于,在Ada中,异常不是数据类型。可以与异常实例关联的唯一数据是字符串:

raise My_Exception with "some string";
因此,在捕获异常时,我们只能知道抛出了哪种异常,并获得了一些可能对日志记录有用的String,但是对于以编程方式更详细地分析出问题的细节却没有那么多。
这也意味着我们没有办法链接异常,就像通常那样。在Java中,通常将一个异常包装在另一个异常中以隐藏详细信息,同时仍可以在堆栈中查看到底出了什么问题。
这是因为该语言是为很少使用的异常(exception)而设计的。与Python不同,Ada的设计目标是裸机,出于性能原因,您可能希望在其中禁用运行时检查。如果这样做,将不会得到被零除的Constraint_Error,程序将具有未定义的行为。因此,使用异常会对代码的可移植性产生负面影响。
一些编译器提供了其他选项,例如GNAT中的No_Exception_Propagation限制,仅当它们被同一子例程捕获时才允许异常(exception)。
尽管如此,异常是在不完全妨碍代码中正常程序流程的情况下传达故障的有用工具(如果您曾经编写Go或C语言,您将明白我的意思)。但通常,Ada Style Guide advises that

Exceptions should be used as part of an abstraction to indicate error conditions that the abstraction is unable to prevent or correct. Because the abstraction is unable to correct such an error, it must report the error to the user.


这意味着,如果您确实有可能在不使用异常的情况下纠正问题,则应该这样做,因为它应该是正常的,非异常的程序流程的一部分。

关于ada - 在Ada中使用异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63037858/

相关文章:

generics - 泛型实例化何时发生(即该词的含义是什么)?

windows - 如何编译这个程序?链接器阶段错误

scheduled-tasks - EDF 中的 Ada 调度

ada - (Ada 2012) 编译时错误 "expected private type... found composite type"

ada - 使用 Unchecked_Conversion 读取值并转换为自定义类型

ada - 使用访问类型在 protected 对象中调用过程时出现问题

c++ - 将 ADA API 公开给 C/C++(可扩展方式)

c - 我如何在 Ada 中处理一个 int** ?

windows - 如何在 Windows 计算机上安装 GNAT (GNU Ada)?

调用从 Ada 返回数组的 C 函数