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