2017-01-13 2 views
1

Ich arbeite mit einem verknüpften Listenstapel und ich möchte, dass es einen Unterlauffehler erhält, damit ich sehen kann, dass es richtig funktioniert. Es gibt jedoch weiterhin eine Constraint-Fehlermeldung, wo ich möchte, dass es die Unterlauf-Nachricht gibt. Irgendwelche Tipps, was zu tun wäre, wären hilfreich. Ich kann nicht den Code zum gegenwärtigen Zeitpunkt für meinen Server wird nach unten setzen, aber ich werde dieses Update so schnell wie ich kannWie ändert man in Ada einen constraint_error in eine selbst definierte Ausnahme?

+0

Ihre verknüpfte Liste hat sicherlich einige Operationen, entweder benannte, oder solche, die die Knoten der Liste manipulieren. Eine dieser Operationen löst 'Constraint_Error' aus. Ist diese Operation spezifisch an die Unterlaufbedingung gebunden, oder gibt es andere Umstände, die dazu führen können, dass 'Constraint_Error' ausgelöst wird? Können Sie eine Operation mithilfe zusätzlicher Informationen an Unterlauf binden, z. B. den Status von Listenvariablen? Wenn ja, dann wird diese Tatsache zusammen mit der Antwort von Brian Drummond nutzbar. – B98

Antwort

5

Zwei Möglichkeiten: (okay, drei ...)

(1) Die saubere Art und Weise Stellen Sie sicher, dass Sie die Einschränkung in der Underflow-Bedingung nicht verletzen.

Sie können denken, dass es wegen der expliziten Überprüfung langsam ist. Unabhängig davon, ob dies als vorzeitige Optimierung gilt, wird die Überprüfung jedoch implizit durchgeführt, um Constraint_Error auszulösen. Ob das tatsächlich irgendwann kostet, hängt von Ihrem Compiler und Optimierungsgrad ab. Mit einem guten Compiler wird es wahrscheinlich nicht.

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) Fangen Sie den Constraint-Fehler und erhöhen Sie stattdessen Ihre. Dies ist unrein, da alle anderen Constraint-Fehler im gleichen Bereich (irreführend) in Underflow Error konvertiert werden.

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) Variante von (2) Fangen Sie den Constraint-Fehler, führen Sie Post-Mortem-Analyse durch und erhöhen Sie entsprechend. Die zusätzliche Berechnung erfolgt nur im Ausnahmefall, hat also im Wesentlichen keine Auswirkungen auf die Performance.

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

Ich glaube nicht, dass Sie das 'wenn andere => erhöhen;'? –

+0

@SimonWright Sie sind natürlich richtig. Übermäßige Vorsicht meinerseits. Ausnahmen, die nicht explizit abgefangen wurden, werden trotzdem weitergegeben. Aber wenn Sie ein "wenn andere" haben (z. B. um zu protokollieren, dass die Ausnahme hier aufgetreten ist) und Sie die Ausnahmen nicht essen möchten, dann wird ein "Raise" es an die äußeren Handler weiterleiten. –

Verwandte Themen