如何使用Ada中的消息引发异常

时间:2017-11-21 17:31:27

标签: exception ada

我正在努力提高例外情况,就像我过去常常来自C#背景一样。

我有一个实用程序函数,它希望输入值在一个非常特定的范围内,如外部标准所定义。如果在该范围之外提供了一个值(并且在该范围的中间有一个值也是无效的),那么我想向调用者引发一个异常,以便它们中断。

据我所知,语法为raise Invalid_Argument;

但是 - 是否可以提供包含例外的消息?例如Invalid_Argument异常在某种程度上是不言自明的,但我可以看到进一步详细说明参数的错误。如何编写一条简短的错误消息以阻止异常?

2 个答案:

答案 0 :(得分:4)

它使用(Ada 95)你必须写

Ada.Exceptions.Raise_Exception (Invalid_Argument’Identity,
                                "message");

(见Ada95RM 11.4.2(6))但自从Ada 2005以来你就能说出来了

raise Invalid_Argument with "message";

A2005RM 11.3)。

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

答案 1 :(得分:3)

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

[sub]type Valid_Range_For_X is [Integer] range 23 .. 2001;

这将自动捕获大多数无效值。如果您使用的是Ada 12,则可以添加

[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个案例和(通常很多)其他类型的无效参数。我意识到不是每个人都同意这一点。