Ada:违反;无“例外”传播;

Ada:违反;无“例外”传播;,ada,Ada,在LED_演示STM32示例项目中,我有以下代码(在GPS中编译): 如果我将相同的代码修改为下面的代码,它将不会编译。我得到错误“违反限制无异常传播” 有人能解释一下为什么会这样吗?文档中对此进行了解释 (增加重点) 5.1.28无异常传播 [GNAT]此限制保证永远不会出现异常 传播到外部子程序范围。只有在这种情况下 当处理程序静态地处于同一位置时,可能会引发异常 子程序,因此加薪的效果本质上类似于转到 陈述任何其他raise语句(隐式或显式)都将 被认为是未经处理的。允许使用异常处理程序

在LED_演示STM32示例项目中,我有以下代码(在GPS中编译):

如果我将相同的代码修改为下面的代码,它将不会编译。我得到错误“违反限制无异常传播”


有人能解释一下为什么会这样吗?

文档中对此进行了解释

(增加重点)

5.1.28无异常传播

[GNAT]此限制保证永远不会出现异常 传播到外部子程序范围。只有在这种情况下 当处理程序静态地处于同一位置时,可能会引发异常 子程序,因此加薪的效果本质上类似于转到 陈述任何其他raise语句(隐式或显式)都将
被认为是未经处理的。允许使用异常处理程序,,但可能不允许 包含异常发生标识符(异常选择)。在里面 此外,不允许使用程序包
GNAT。当前的\u例外情况
,
和reraise语句(无操作数的raise)是不允许的


标识符
错误
违反了限制。

文档中对此进行了解释

(增加重点)

5.1.28无异常传播

[GNAT]此限制保证永远不会出现异常 传播到外部子程序范围。只有在这种情况下 当处理程序静态地处于同一位置时,可能会引发异常 子程序,因此加薪的效果本质上类似于转到 陈述任何其他raise语句(隐式或显式)都将
被认为是未经处理的。允许使用异常处理程序,,但可能不允许 包含异常发生标识符(异常选择)。在里面 此外,不允许使用程序包
GNAT。当前的\u例外情况
,
和reraise语句(无操作数的raise)是不允许的


标识符
错误
违反了限制。

允许使用异常处理程序,但可能不包含异常发生标识符(异常选择)。“您知道这一点的原因吗?@Johnson:不,我不知道。也许它可以被用来做一些邪恶的事情,比如把它传给其他地方,但我的Ada已经生锈了。或者可能有一些技术原因使这种方式更容易实施。我对使用
无异常传播时不允许这种情况的理解是,存储和保存当前异常信息所需的功能需要在
Ada中实现。异常
包裹由于某些硬件可能无法支持用于实现更全面异常处理的堆栈展开等功能,因此该杂注完全限制了该功能。根据GCC文档的支持,我的理解是,当使用这个pragma时,所有本地异常处理本质上等同于C中的
goto
。“允许使用异常处理程序,但可能不包含异常发生标识符(异常选择)。“你知道这样做的理由吗?@Johnson:不,我不知道。也许它可以被用来做一些邪恶的事情,比如把它传给其他地方,但我的Ada已经生锈了。或者可能有一些技术原因使这种方式更容易实施。我对使用
无异常传播时不允许这种情况的理解是,存储和保存当前异常信息所需的功能需要在
Ada中实现。异常
包裹由于某些硬件可能无法支持用于实现更全面异常处理的堆栈展开等功能,因此该杂注完全限制了该功能。根据GCC文档的支持,我的理解是,当使用这个pragma时,所有本地异常处理本质上等同于C中的
goto
。我还看到了“Exceptions”中未声明的“exception_信息”(这是ravenscar-sfp-stm32f4)。我还看到了“Exceptions”中未声明的“exception_信息”(这是ravenscar-sfp-stm32f4)。
procedure Does_Nothing is
begin
   Null;
exception
   when others =>
      Null;
end Does_Nothing;
procedure Does_Nothing is
begin
   Null;
exception
   when Error: others =>
      UART.Put(Exception_Information(Error));
end Does_Nothing;