Я работаю со стеком связанных списков, и я хочу, чтобы он получил ошибку Underflow, поэтому я вижу, что он работает правильно. Тем не менее, он продолжает давать мне сообщение об ошибке ограничения, в котором я хочу, чтобы сообщение о недополнении. Любые советы о том, что делать, были бы полезными. Я не могу поставить код в текущий момент для моего сервера вниз, но я буду обновлять это, как только я могуВ Ada, как вы изменяете constraint_error на самоопределенное исключение?
ответ
двумя способами: (хорошо, три ...)
(1) чистый способ : Убедитесь, что вы не нарушаете ограничение в состоянии underflow.
Вы можете думать, что это медленное из-за явной проверки. Однако, независимо от того, считается ли это преждевременной оптимизацией, проверка происходит неявно, чтобы повысить 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) Поймите ошибку ограничения и поднимите свой вместо этого. Это нечисто, потому что любая другая ошибка Constraint в той же области будет (ошибочно) преобразована в Underflow Error.
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 => raise;'? –
@SimonWright Вы, конечно, правы. Превышение осторожности с моей стороны. Исключения, явно не захваченные, передаются в любом случае. Но если у вас есть «когда другие» (например, чтобы регистрировать, что здесь произошло исключение), если вы не хотите есть исключения, тогда «рейз» передаст его внешним обработчикам. –
Ваш связанный список, безусловно, имеет некоторые операции, или именованные, или те, которые управляют узлами списка. Одна из этих операций вызывает «Constraint_Error». Является ли эта операция специально привязанной к условию underflow, или есть другие обстоятельства, которые также могут заставить его поднять 'Constraint_Error'? Можете ли вы связать одну операцию с нижестоящим, используя дополнительную информацию, такую как состояние переменных списка? Если это так, то этот факт станет полезным вместе с ответом Брайана Драммонда. – B98