Dec Ada&例外

时间:2017-01-13 09:22:29

标签: exception ada

我在一个模块中有这个代码:

PROCEDURE Get (File: IN Ada.Text_IO.File_Type; Item : OUT Rational) IS

N: Integer;
D: Integer;
Dummy: Character;  

BEGIN -- Get
LOOP
BEGIN
  Ada.Integer_Text_IO.Get(File => File, Item => N);
  Ada.Text_IO.Get  (File => File, Item => Dummy);
  Ada.Integer_Text_IO.Get(File => File, Item => D);
  Item := N/D;
  if Dummy /= '/' then
   ........;
  end if;

EXIT;

EXCEPTION
     when other =>
          Ada.Text_IO.Put_Line(" here is exception ");
END;
END LOOP;
END Get;

与第二段代码有何不同。

我的问题主要是如果我没有在异常声明的正文中加上提升会发生什么?

PROCEDURE Get (File: IN Ada.Text_IO.File_Type; Item : OUT Rational) IS

N: Integer;
D: Integer;
Dummy: Character;  

BEGIN -- Get
LOOP
BEGIN
  Ada.Integer_Text_IO.Get(File => File, Item => N);
  Ada.Text_IO.Get  (File => File, Item => Dummy);
  Ada.Integer_Text_IO.Get(File => File, Item => D);
  Item := N/D;
  if Dummy /= '/' then
    ........;
  end if;

EXIT;

EXCEPTION
     when other =>
          Ada.Text_IO.Put_Line(" here is exception ");
    **raise;**
END;
END LOOP;
END Get;

我的问题主要是如果我没有在异常声明的正文中加上 raise 会发生什么?

非常感谢。

1 个答案:

答案 0 :(得分:0)

两个代码模块之间的唯一区别是异常(如果在执行Get期间引发任何异常)被重新启动,即异常传播给Get的调用者。

这是否是所需的行为取决于您的需求,即Get的调用者是否需要知道发生了异常?

在您的示例中,可能会发生几种异常,例如

  • 未读取正确/预期的输入(要读取的文件不以数字开头)
  • 尝试从尚未打开的文件中读取
  • 将D读为0(从而导致除以0)

所有这些都通过打印“here is exception”以相同的方式处理。 Get的第一个实现然后默默地将控制返回给调用者(谁不会知道发生了什么奇怪的事情)。但是,第二个实现将通过重新引发异常来通知调用者。

有关更多信息,请参阅AdaLRM§11.3(提高声明)。