如何在 Ada 中使用消息引发异常
How To Raise Exception with Message in Ada
我有点难以按照我习惯于来自 C# 背景的方式引发异常。
我有一个效用函数,它期望输入值在一个非常特定的范围内,如外部标准所定义的那样。如果提供的值超出该范围(并且范围中间有一个值也是无效的),那么我想向调用者抛出一个异常,以便它们中断。
据我所知,语法是 raise Invalid_Argument;
但是- 是否可以提供异常消息?例如Invalid_Argument
异常有点不言自明,但我可以看到更多详细信息,说明参数有什么问题。如何编写简短的错误消息以陷入异常?
它曾经是 (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).
请注意,字符串部分是一个字符串 表达式,因此如果有用的话,您可以添加一些内容来描述实际的无效值。
首先,你可以定义一个[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 的情况与(通常很多)其他类型的无效参数区分开来。我知道不是每个人都同意这一点。
我有点难以按照我习惯于来自 C# 背景的方式引发异常。
我有一个效用函数,它期望输入值在一个非常特定的范围内,如外部标准所定义的那样。如果提供的值超出该范围(并且范围中间有一个值也是无效的),那么我想向调用者抛出一个异常,以便它们中断。
据我所知,语法是 raise Invalid_Argument;
但是- 是否可以提供异常消息?例如Invalid_Argument
异常有点不言自明,但我可以看到更多详细信息,说明参数有什么问题。如何编写简短的错误消息以陷入异常?
它曾经是 (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).
请注意,字符串部分是一个字符串 表达式,因此如果有用的话,您可以添加一些内容来描述实际的无效值。
首先,你可以定义一个[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 的情况与(通常很多)其他类型的无效参数区分开来。我知道不是每个人都同意这一点。