【问题标题】:How To Raise Exception with Message in Ada如何在 Ada 中使用消息引发异常
【发布时间】:2018-05-05 06:38:17
【问题描述】:

我正在努力以习惯于来自 C# 背景的方式引发异常。

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

据我所知,语法是raise Invalid_Argument;

但是-是否可以提供异常消息?例如Invalid_Argument 异常在某种程度上是不言自明的,但我可以看到更多详细信息,说明该论点出了什么问题。如何编写简短的错误消息以卡在异常中?

【问题讨论】:

    标签: exception ada


    【解决方案1】:

    它曾经(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).

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

    【讨论】:

    • 我错过了'Identity 属性~
    【解决方案2】:

    首先,你可以定义一个 [sub]type

    [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 大小写与(通常很多)其他类型的无效参数区分开来更容易。我知道并不是每个人都同意这一点。

    【讨论】:

    • 这正是我正在做的(我们没有 Ada 12)。但是,我的问题不是如何定义有限的子类型,而是处理如何创建自定义的异常消息。也许我对此的解释应该是这样做是正确的,而不是创建自定义异常消息?
    • 我建议使用细粒度异常而不是通过不同异常消息区分的一般异常。考虑处理 10 个不同的异常与处理具有 10 个不同消息的单个异常之间的区别。考虑后者对代码结构的约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2012-02-27
    • 1970-01-01
    • 2010-12-17
    • 2021-04-15
    相关资源
    最近更新 更多