Exception 12月Ada&;例外

Exception 12月Ada&;例外,exception,ada,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, I

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

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;
第二个代码的区别是什么

我的主要问题是,如果我不在例外声明的主体中添加raise,会发生什么

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;
我的主要问题是,如果我不把提高放在例外声明的主体中,会发生什么


非常感谢。

这两个代码模块之间的唯一区别是重新调用异常(如果在Get执行期间引发任何异常),即将异常传播到Get的调用方

这是否是期望的行为取决于您的需要,即Get的调用方是否需要知道发生了异常

在您的示例中,可能会出现几种例外情况,例如:

  • 未读取正确/预期的输入(要读取的文件不是以数字开头)
  • 试图从尚未打开的文件中读取
  • 将D读取为0(从而导致除以0)
所有这些都以相同的方式通过打印“此处为例外”进行处理。Get的第一个实现然后以静默方式将控制权返回给调用者(调用者将不知道发生了什么奇怪的事情)。但是,第二个实现将通过重新调用异常来通知调用方


有关更多信息,请参阅《美国残疾人法案》第11.3节(提高声明)。

这应该通过阅读任何有关《美国残疾人法案》的书籍中关于例外的章节或通过实验来回答。非常感谢您的回复。但是,我只是想知道一个一般的答案。我想在一个函数中,假设其中调用了许多函数,那么将异常处理程序仅保留在主函数中,还是保留在所有中间调用函数中,在这些函数中可以引发各自的异常,这是一个好主意。谢谢你如果你关于Ada的书有什么好的,它将解释异常处理的方法。在哪里、何时、在多大程度上,什么样的例外,等等。一个指导性问题是:外部子程序是否“知道”如何处理内部子程序中引发的异常?@B98:外部子程序不“知道”如何处理内部子程序中引发的异常。