在Ada中,如何将constraint_error更改为自定义的异常?

时间:2017-01-13 16:32:11

标签: linked-list stack ada

我正在使用链表列表,我希望它得到一个下溢错误,所以我可以看到它正常工作。但是,它一直给我一个约束错误消息,我希望在那里有下溢消息。任何有关做什么的提示都会有所帮助。我目前无法提出代码,因为我的服务器已关闭,但我会尽快更新此代码

1 个答案:

答案 0 :(得分:5)

两种方式:(好吧,三......)

(1)干净的方式:确保您不会违反下溢情况下的约束。

由于明确的检查,您可能认为它很慢。但是,无论是否算作过早优化,无论如何都会隐式地进行检查以引发Constraint_Error。这实际上是否花费任何时间取决于您的编译器和优化级别。有了一个好的编译器,它可能会赢得

Underflow_Error : Exception;
Declare
   A,B,C : Natural;
   D : Integer; -- a "bigger" type that can accommodate the worst case value
Begin
   -- A := B - C; -- may raise constraint error
   D := B - C;
   if D < 0 then 
      raise Underflow_Error;
   else 
      A := D;
   end if;
End;

(2)抓住约束错误并改为提升你的。这是不洁净的,因为同一范围内的任何其他约束错误将(误导性地)转换为下溢错误。

Underflow_Error : Exception;
Declare
   A,B,C : Natural;
Begin
   A := B - C; -- Let it raise constraint error
Exception:
   when Constraint_Error =>  -- convert to my exception
      raise Underflow_Error;
   -- when others => raise;     -- un-handled exceptions are passed upwards anyway
End;

(3)(2)的变体捕捉约束误差,进行事后分析并适当提高。额外的计算仅在特殊情况下,因此基本上没有性能影响。

Underflow_Error : Exception;
Declare
   A,B,C : Natural;
Begin
   A := B - C; -- Let it raise constraint error
Exception:
   when Constraint_Error =>   -- if appropriate, convert to my exception
      if B - C < 0 then
         raise Underflow_Error;
      else 
         raise;
      end if;
End;