Exception 如何在Ada中用消息引发异常

Exception 如何在Ada中用消息引发异常,exception,ada,Exception,Ada,我正在努力提出一些例外情况,就像我习惯于来自C#背景一样 我有一个实用函数,它期望输入值在外部标准定义的非常特定的范围内。如果在该范围之外提供一个值(并且在该范围中间有一个值也是无效的),那么我想对调用方提出一个异常,使其中断。 据我所知,语法是raiseinvalid_参数 但是-是否可以提供带有异常的消息?e、 g.Invalid_参数exception在某种程度上是不言自明的,但我可以看到进一步的细节,说明参数的错误。我如何编写一条简短的错误消息,使其卡在异常中?它使用(Ada 95),您

我正在努力提出一些例外情况,就像我习惯于来自C#背景一样

我有一个实用函数,它期望输入值在外部标准定义的非常特定的范围内。如果在该范围之外提供一个值(并且在该范围中间有一个值也是无效的),那么我想对调用方提出一个异常,使其中断。

据我所知,语法是
raiseinvalid_参数

但是-是否可以提供带有异常的消息?e、 g.
Invalid_参数
exception在某种程度上是不言自明的,但我可以看到进一步的细节,说明参数的错误。我如何编写一条简短的错误消息,使其卡在异常中?

它使用(Ada 95),您必须编写它

Ada.Exceptions.Raise_Exception (Invalid_Argument’Identity,
                                "message");
(见第(6)段)但自2005年《美国残疾人法案》以来,你可以说

raise Invalid_Argument with "message";
()


请注意,字符串部分是一个字符串表达式,因此如果有用,可以添加一些内容来描述实际的无效值。

首先,可以定义[sub]类型

[sub]type Valid_Range_For_X is [Integer] range 23 .. 2001;
这将自动捕获大多数无效值。如果您使用的是ADA12,您可以添加

[sub]type Valid_Range_For_X is [Integer] range 23 .. 2001 with
   Dynamic_Predicate => Valid_Range_For_X /= 42;
这也将捕获内部无效值。让语言为您执行此类检查通常比手动执行要好

如果您使用的是早期版本的Ada,则必须手动检查内部值。我通常更喜欢细粒度的异常,而不是用于许多事情的一般异常,由异常消息区分。所以我会提出类似的建议

X_Is_42
而不是

Invalid_Argument with "X is 42"

这使得区分42个案例和(通常是许多)其他类型的无效参数变得更容易。我意识到并不是每个人都同意这一点。

我缺少了
“标识”
属性~这正是我正在做的事情(我们没有Ada 12)。然而,我的问题不是如何定义有限的子类型,而是如何创建定制的异常消息。也许我对此的解释应该是这样做是正确的,而不是创建自定义异常消息?我建议使用细粒度异常,而不是由不同异常消息区分的一般异常。考虑处理10个不同异常以处理10个不同消息的单个异常之间的差异。考虑后者对代码结构的约束。