Gibt es grundsätzlich Ausnahmen, um einen Systemabsturz zu verhindern?

16

Zweitens habe ich mich gefragt, ob jemand weiß, was der Unterschied zwischen Ausnahmen (im Bereich des Ausnahmesteuerungsflusses) und Ausnahmen (wie sie in Java verwendet werden) ist.

Aber sind sie da, um das System durch Beenden des Anwenderprogramms grundsätzlich vor Abstürzen zu schützen?

Dunkler Templer
quelle

Antworten:

29

Es gibt Ausnahmen für die Ausnahmebehandlung , mit denen Abstürze vermieden , aber im Allgemeinen unerwünschtes oder unvorhersehbares Systemverhalten verhindert werden kann. Wenn beispielsweise die Verbindung meines Programms zu einer Datenbank aufgrund einer Zeitüberschreitung unterbrochen wird, stürzt das System normalerweise nicht ab. Wenn ich jedoch auf Daten aus der Datenbank angewiesen bin, kann eine Ausnahme es mir ermöglichen, diese datenlose Situation anders als normal zu behandeln.

Angenommen, mein Programm zeigt standardmäßig eine Seite mit Daten an, die auf dem basieren, was von der Datenbank zurückgegeben wurde - also Mist, ich habe keine Daten. Anstatt eine fehlerhafte Ansicht anzuzeigen oder einen möglicherweise ungültigen Vorgang fortzusetzen, kann ich diese Ausnahme abfangen und auf eine andere Datenbank zurückgreifen, aus lokalen Daten lesen, den Benutzer nach Daten fragen oder den Benutzer oder das System auf andere Weise in einen sicheren Zustand zurückversetzen (vermutlich einen das wird nicht gleich die selbe ausnahme verursachen!)

In Systemen, in denen Benutzereingaben die Ursache / Lösung eines Problems sein können, können Ausnahmen dem Benutzer detaillierte und hilfreiche Informationen über das Problem mitteilen. Anstelle der allzu häufigen Meldung "Eine nicht behandelte Ausnahme ist aufgetreten um ..." oder "Einschüchternde Fehlermeldung direkt aus SQL" können Sie dem Benutzer eine hilfreiche oder zumindest verständliche Meldung wie "Konnte keine Verbindung zu Ressource B herstellen" übermitteln.

Ben Brocka
quelle
5
Ich denke, das ist die genaueste Antwort. Programme sind Finite-State-Maschinen, die funktionieren. Es gibt Möglichkeiten, die Maschine zu beschädigen, indem falsche Daten eingegeben werden, die zu Fehlfunktionen führen können. Ausnahmen werden geworfen, um dies zu verhindern. Manchmal kann sich die Maschine von selbst erholen, manchmal kann sie nicht.
Andy
1
Könnte ich nicht genau dasselbe mit Fehlercodes machen? Sie geben einen Fehler zurück, und ich behandle ihn.
mskw
16

Ausnahmen wurden erstellt, um die Fehlerbehandlung zu vereinfachen. Ausnahmslos muss die Fehlerbehandlungslogik in einer Anwendung verteilt werden. Jede Funktion, die möglicherweise zu einem Fehler führen kann, muss einen Fehlerstatus zurückgeben, und auf jeden Aufruf muss eine Fehlerprüfung folgen. Oft kann der Anrufer im Fehlerfall nichts Nützliches tun und nur einen Fehler selbst zurückgeben. Die Hälfte des Anwendungscodes kann für die Fehlerbehandlung verwendet werden. Ein solcher Code ist extrem zerbrechlich. Es ist allzu einfach, eine Fehlerüberprüfung auszulassen und einen Absturz oder schlimmer noch, falsche Ergebnisse aufgrund eines unbemerkten Fehlers zu erhalten.

Mit Ausnahmen können Fehler nur an dem Punkt überprüft werden, an dem sie behandelt werden können. Die meisten Anwendungscodes können linear geschrieben werden, da Funktionen entweder einen verwendbaren Wert zurückgeben oder eine Ausnahme auslösen.

Kevin Cline
quelle
5

Der Ausnahmefall sollte darin bestehen, den Benutzer über außergewöhnliche Umstände zu informieren. Wenn mit dem System etwas schief geht, sollte das Programm es wissen und in der Lage sein, es angemessen zu behandeln.

Das heißt, nein, es gibt keine Ausnahme, um ein "Abstürzen" des Systems zu verhindern. Eine Ausnahme ist, dass ich weiß, dass ein Problem vorliegt. Wie ich vorgehen soll kann feststellen, ob das System "abstürzt".

Beachten Sie auch, dass eine Ausnahme eine Anwendung nicht beenden muss, wie Sie gesagt haben. Eine Ausnahme kann vom Programmierer behandelt und korrigiert oder in einen für den Benutzer bedeutsamen Fehler umgewandelt werden.


* Die Verwendung von geprüften Ausnahmen (Ausnahmen, die abgefangen werden müssen) ist ein bisschen wund. Einige (vielleicht die meisten) Entwickler finden, dass die erzwungene Ausnahmebehandlung umständlich, unnötig und nur eine schlechte Übung ist.


quelle
2
Ich bin anderer Meinung, diese Definition ist zu begrenzt. Dem Benutzer sollte immer nur eine Teilmenge von Ausnahmen angezeigt werden. Ausnahmen betreffen die Fehlerbehandlung, und das Aufgeben und Informieren des Benutzers ist in der Regel der letzte Schritt und sollte nicht die Norm sein. Einige Systeme sind so konzipiert, dass Ausnahmen auch für bestimmte Arten der Flusssteuerung verwendet werden, z. B. End of Iterable, EOF usw.
Jürgen Strobel,
Jürgen, ich verstehe und stimme deinem Kommentar voll und ganz zu. "korrigiert oder in einen bedeutungsvollen Fehler verwandelt" - Übermittle ich diesen Gedanken nicht mit dieser Aussage?
Ja, es ist jetzt viel besser.
Jürgen Strobel
Ausnahmen sollten den Benutzern wohl nie angezeigt werden. (Die Bedingungen, unter denen sie generiert wurden, müssen möglicherweise den Benutzern gemeldet werden, jedoch nicht als Ausnahmen.) Eine Ausnahme ist jedoch immer besser, als wenn das Programm nur eine DIAF oder einen Überraschungsexit ausführt. („Jedes Mal, wenn ich versuche, meine E-Mails nach dem Absendernamen zu sortieren, wird der E-Mail-Client stillschweigend beendet.“ Egal wie sauber dieser Ausgang ist, er ist immer noch falsch.)
Donal Fellows,
2

Ausnahmen ermöglichen eine moderne Fehlerbehandlung, indem die Fehlerstelle vom Fehlerbehandler getrennt wird. Manchmal wird dies auch zur Flusskontrolle verwendet.

Nicht behandelte Ausnahmen beenden ein Programm. Diese unterscheiden sich jedoch nicht von den vorherigen Ausnahmen. Nur ein fauler Programmierer, der vergessen hat, ordnungsgemäße Fehlerbehandlungsroutinen in jeden Pfad aufzunehmen, macht sie für den Endbenutzer sichtbar. Ich betrachte ein Programm, das ausnahmsweise beendet wurde, als abgestürzt, genau wie jedes andere unerwartete Ende.

Betriebssysteme sind sehr gut darin, abgestürzte Prozesse zu bereinigen, unabhängig davon, wie sie abgestürzt sind. Ausnahmen bieten also keine zusätzliche Sicherheit für das Betriebssystem, als fehlerhafte Prozesse zu beenden und ihre Ressourcen freizugeben.

Jürgen Strobel
quelle
Es gibt Grenzen für die Bereinigung durch ein Betriebssystem. Im Allgemeinen kann ein Betriebssystem nicht wissen, ob persistente Ressourcen (z. B. Dateien) bereinigt oder zurückgesetzt werden müssen, und es kann auch nicht wissen, ob für eine Remoteverbindung eine Bereinigung erforderlich ist, außer dass die Verbindung einfach auf der lokalen Seite geschlossen wird.
8bittree
2

Es ist sehr einfach.

  • Um nur das Programm zum Absturz zu bringen und nicht das gesamte System - wir haben [gute] Betriebssysteme.
  • Es gibt Ausnahmen, um ein Programm zum Absturz zu bringen, anstatt einen schwerwiegenden Fehler zu ignorieren.

Bevor Ausnahmen erfunden wurden, musste jede Funktion einen Exit-Code (Fehler / Erfolg) zurückgeben, und jedes Ergebnis oder jede Ausgabe der Funktion musste durch Übergabe eines Zeigers an den von ihr zu setzenden Speicher abgerufen werden.

Das Problem war, dass sich viele Programmierer nicht daran erinnerten, für jede einzelne Funktion nach fehlerhaften Beendigungscodes zu suchen, und daher wurden manchmal schwerwiegende Fehler ignoriert, was zu völlig unerklärlichen Verhaltensweisen führte.

Daher wurde entschieden - wenn ein Fehler auftritt, den Sie nicht berücksichtigt haben, stürzen Sie sofort ab! AKA-Ausnahmebehandlung.

Yam Marcovic
quelle
1

Ausnahmen sind lediglich Fehlererkennungsmechanismen. Für sich genommen nützen sie nichts.

Indem sie einen Fehler erkennen, können sie Fehlertoleranzmechanismen auslösen, um den fehlerhaften Zustand durch Umschalten in einen fehlerfreien Zustand (einen vorherigen oder einen neuen Zustand) zu beheben. Auf diese Weise wird der Fehler nicht auf andere Teile des Systems übertragen.

mouviciel
quelle
0

Es gibt Ausnahmen, um den normalen Programmfluss (was das Programm tun soll) vom Fehlerbehandlungsfluss (wie das Programm versucht, sich von einer Ausnahmesituation zu erholen ) zu trennen .

Dies macht den Code klarer und einfacher zu warten.

Betrachten Sie zwei Code-Sniplets:

try:
    do1()  # this is obvoiusly a normal
    do2()  # program flow
except:
    oups()  # this is exception handling code

Im Vergleich zu diesem:

if foo():
    thing1()  # is this part of normal program flow?
else:
    thing2()  # or maybe this one? Or both? When?

Natürlich kann die Ausnahmebehandlung verwendet werden, um ein Abstürzen des Programms zu verhindern, indem:

try {    // very bad code
    my();
    whole();
    ugly();
    application();
    here();
} catch (Throwable t) {
    // pretend it's ok
}

Dies ist jedoch nicht der Grund für die Ausnahmen in modernen Programmiersprachen.

Sie können auch whileund breakanstelle von verwenden, ifaber dies ist nicht das, was whileund wofür break.

Michał Šrajer
quelle
Tatsächlich ist die Behandlung eines "abnormalen" Kontrollflusses genau dann sinnvoll, wenn goto und sein Friend break am nützlichsten sind. Der Vorteil von Ausnahmen besteht darin, dass sie Funktionsgrenzen überschreiten können und der Aufrufer bestimmen kann, wo er sie am besten abfangen kann.
Hugomg
@hugomg: Ein weiterer großer Vorteil von Ausnahmen besteht darin, dass sie die Bereinigung von Ressourcen und andere derartige Aktionen zwischen dem Ort, an dem eine Ausnahme ausgelöst wird, und dem Ort, an dem sie behandelt werden, ermöglichen.
Supercat