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?
Antwort
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;
Ich glaube nicht, dass Sie das 'wenn andere => erhöhen;'? –
@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. –
- 1. Wie erstelle ich einen String aus anderen Saiten in Ada?
- 2. Dezember Ada & Ausnahme
- 3. Ada: Verletzung der "No_Exception_Propagation" - Teil 2
- 4. In Ada, Wie ordne ich rekursiv zuordnen und Speicher einen Typ in sich selbst
- 5. Wie implementiert man die Schnittstelle in Ada?
- 6. Unerwarteter CONSTRAINT_ERROR nach GCC-Update
- 7. Wie ändert man einen Variablentyp in C#?
- 8. So verwenden Sie eine selbst definierte Distanzmetrik in Sklearn
- 9. Wie ändert man einen Wert in Multimap?
- 10. char_array Zuordnung in Ada
- 11. Nicht definierte Methode in Mehrfach-Ausnahme-Catch
- 12. Heben Sie eine Ausnahme für nicht definierte Attribute in jinja2
- 13. Benutzer definierte Ausnahme in Oracle-Trigger
- 14. Verstehen, wie Ada einen Datensatz serialisiert
- 15. Wie ändert man einen Primärschlüssel in SQL in auto_increment?
- 16. Wie man eine Ausnahme in C wirft?
- 17. Wie man eine in groovy script definierte Klasse in einen anderen groovy
- 18. Wie können Sie eine Ada.Calendar.Time-Variable in Ada drucken?
- 19. Wie drucke ich einen generischen Typ in ada?
- 20. Wie erhält man definierte Variablen in Swift?
- 21. Variable ändert sich selbst
- 22. Wie spezifiziert man eine definierte Sortierung in der Sharepoint-Liste?
- 23. Meteor Wie ruft man eine in Meteor.methods() definierte Methode auf?
- 24. Wie man eine gRPC definierte API in den Webbrowser bringt
- 25. Multithreading in Ada
- 26. Wie man eine Textdatei ändert?
- 27. Quadratische Gleichung in Ada
- 28. Seekbar ändert Wert selbst in RecyclerView
- 29. Wie ändert man einen TabPanel Inhalt?
- 30. In Ada generische Pakete
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