当前位置:  开发笔记 > 运维 > 正文

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

如何解决《在Ada中,如何将constraint_error更改为自定义的异常?》经验,为你挑选了1个好方法。

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



1> Brian Drummo..:

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

(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;

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有