Assertions verwenden und Exceptions auslösen?

38

Wenn ich eine Funktion schreibe, möchte ich oft sicherstellen, dass die Eingaben gültig sind, um solche Fehler so früh wie möglich zu erkennen (ich glaube, dies nennt man Vorbedingungen). Wenn eine Vorbedingung fehlschlägt, habe ich immer eine Ausnahme ausgelöst. Aber ich fange an zu bezweifeln, ob dies die beste Vorgehensweise ist und wenn nicht, wären Behauptungen angemessener.

Wann sollte ich also was tun? Wann ist es angebracht, eine Behauptung zu verwenden und wann ist es angebracht, eine Ausnahme auszulösen?

gablin
quelle
3
Ich denke, diese Frage sollte beim Stackoverflow gestellt werden, obwohl sie dort wahrscheinlich ein Dutzend Mal gestellt wurde, sodass Sie dort möglicherweise bereits viele Antworten finden.
user281377

Antworten:

50

Behauptungen sollten nur verwendet werden, um Bedingungen zu überprüfen, bei denen es logischerweise unmöglich ist , falsch zu sein. Diese Bedingungen sollten nur auf Eingaben basieren, die von Ihrem eigenen Code generiert wurden. Bei Überprüfungen, die auf externen Eingaben basieren, sollten Ausnahmen verwendet werden.

Eine einfache Regel, die ich befolge, besteht darin, die Argumente privater Funktionen mit Asserts zu überprüfen und Ausnahmen für die Argumente öffentlicher / geschützter Funktionen zu verwenden.

Notiz an mich selbst - denke an einen Namen
quelle
Guter Punkt zur Verwendung von Ausnahmen für externe Eingaben. Ich würde auch Ausgaben hinzufügen - Probleme beim Erstellen / Schreiben in Datei / Datenbank usw.
ChrisF
13
Und unvermeidlich werden Sie feststellen, dass diese Behauptungen in der Produktion ausgelöst werden. +1 für die Überprüfung privater Inhalte mit Zusicherungen! Vielleicht könnten Sie sagen "Behauptungen verwenden, wenn Sie die volle Kontrolle über die Eingaben haben"?
Frank Shearar
1
Zumindest in Java müssen Sie die Assertionsprüfung normalerweise mit dem Befehlszeilenparameter -ea aktivieren. Dies bedeutet, dass Zusicherungen praktisch keine Aktionen sind, es sei denn, Sie aktivieren sie ausdrücklich.
Bill Michell
29

Assertions werden zum Auffinden von Programmierfehlern verwendet. Ihre Programme müssen genauso gut funktionieren, wenn alle Behauptungen entfernt wurden.

Ausnahmen bestehen hingegen für Situationen, die auch dann auftreten können, wenn das Programm perfekt ist. Sie werden durch äußere Einflüsse wie Hardware, Netzwerk, Benutzer usw. verursacht.

user281377
quelle
Dies ist ein ziemlich guter Weg, um es auszudrücken. Wenn der Benutzer etwas Falsches eingibt, wird eine Ausnahme ausgelöst. Wenn die Eingabe korrekt ist, aber noch etwas nicht stimmt, werfen Sie eine Bestätigung.
Mateen Ulhaq
3

Typische Programmierpraxis ist das Kompilieren von Behauptungen aus Produktions- / Release-Builds. Behauptungen helfen nur bei internen Tests, das Versagen von Annahmen zu erkennen. Sie sollten nicht das Verhalten externer Agenturen annehmen, also keine Ereignisse vom Netzwerk oder Benutzer auslösen. Es ist auch eine gute Praxis, Handhabungscode für Produktionsbuilds zu schreiben, falls eine Zusicherung fehlschlägt.

Zum Beispiel in C,

int printf(const char *fmt, ...)
{
  assert(fmt);  // may fail in debug build but not in production build
  if (!fmt) return -1; // handle gracefully in production build
  ...
}

Ausnahmen sollen in Produktionsgebäude eingebaut werden. Die Alternative für eine Ausnahme ist die Rückgabe von Fehlern und nicht von Behauptungen.

aufather
quelle
2
Ich denke nicht, dass es eine gute Idee ist, ein anmutiges Verhalten hinter eine Behauptung für denselben Zustand zu stellen. Da das ordnungsgemäße Verhalten nur in der Produktionsversion vorhanden ist, wird der Code, der mit dem ordnungsgemäßen Verhalten umgehen sollte, zwangsläufig schlecht getestet und stürzt genauso ab, wie es der Code ohne Bewachung getan hätte, wenn nicht sogar noch schlimmer.
Sebastian Redl
0

Ein Problem mit Asserts ist für mich, dass sie in Java standardmäßig deaktiviert sind.

Wir verwenden eine Fail-First-Strategie, bei der das Programm, das möglicherweise jahrelang unbeaufsichtigt war, so früh wie möglich abstürzen muss, um eine Beschädigung der Daten bei schlechten Daten (in unerwarteter Form) zu vermeiden. Dafür verwenden wir die Prüfung und durch die Verwendung von Zusicherungen riskieren wir grundsätzlich, dass sie nicht aktiv sind.


quelle