2017-01-13 11 views
1

Я работаю со стеком связанных списков, и я хочу, чтобы он получил ошибку Underflow, поэтому я вижу, что он работает правильно. Тем не менее, он продолжает давать мне сообщение об ошибке ограничения, в котором я хочу, чтобы сообщение о недополнении. Любые советы о том, что делать, были бы полезными. Я не могу поставить код в текущий момент для моего сервера вниз, но я буду обновлять это, как только я могуВ Ada, как вы изменяете constraint_error на самоопределенное исключение?

+0

Ваш связанный список, безусловно, имеет некоторые операции, или именованные, или те, которые управляют узлами списка. Одна из этих операций вызывает «Constraint_Error». Является ли эта операция специально привязанной к условию underflow, или есть другие обстоятельства, которые также могут заставить его поднять 'Constraint_Error'? Можете ли вы связать одну операцию с нижестоящим, используя дополнительную информацию, такую ​​как состояние переменных списка? Если это так, то этот факт станет полезным вместе с ответом Брайана Драммонда. – B98

ответ

5

двумя способами: (хорошо, три ...)

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

Я не думаю, что вам нужно 'when others => raise;'? –

+0

@SimonWright Вы, конечно, правы. Превышение осторожности с моей стороны. Исключения, явно не захваченные, передаются в любом случае. Но если у вас есть «когда другие» (например, чтобы регистрировать, что здесь произошло исключение), если вы не хотите есть исключения, тогда «рейз» передаст его внешним обработчикам. –