我把这个代码放在一个模块中:
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;我的主要问题是,如果我不把在异常声明中添加,会发生什么?
非常感谢。
发布于 2017-01-16 12:56:26
这两个代码模块之间唯一的区别是异常(如果有异常在Get执行期间引发)被重新分配,即异常被传播到Get的调用方。
这是否是想要的行为取决于您的需求,即调用方是否需要知道是否发生了异常?
在您的示例中,可能会出现几种异常。
所有这些都是通过打印“这里是异常”来以相同的方式处理的。Get的第一个实现然后悄悄地将控制返回给调用者(调用者不会知道发生了什么奇怪的事情)。然而,第二个实现将通过重新定义异常通知调用方。
有关更多信息,见Ada LRM第11.3节(提出声明)。
https://stackoverflow.com/questions/41631163
复制相似问题