【问题标题】:In Ada, how do you change a constraint_error to a self-defined exception?在 Ada 中,如何将一个 constraint_error 改成自定义异常?
【发布时间】:2017-01-13 16:32:11
【问题描述】:

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

【问题讨论】:

  • 你的链表肯定有一些操作,要么是命名的,要么是操作链表节点的。其中一项操作引发Constraint_Error。此操作是否与下溢条件特别相关,或者是否有其他情况也可以使其引发Constraint_Error?您能否使用附加信息(例如列表变量的状态)将一项操作与下溢联系起来?如果是这样,那么这个事实就可以与 Brian Drummond 的回答一起使用。

标签: linked-list stack ada


【解决方案1】:

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

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

【讨论】:

  • 我认为你不需要when others =&gt; raise;
  • @SimonWright 你当然是正确的。我过于谨慎了。无论如何,未明确捕获的异常都会传递。但是,如果您有一个“当其他人”(例如,记录此处发生的异常)并且您不想吃异常,那么“raise”会将其传递给外部处理程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多