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

j.S*_*hry 1 stack linked-list ada

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

Bri*_*ond 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;
Run Code Online (Sandbox Code Playgroud)

(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;
Run Code Online (Sandbox Code Playgroud)

(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;
Run Code Online (Sandbox Code Playgroud)