Warum werden Fehler in Programmiersprachen als "Ausnahme" aber nicht als "Fehler" bezeichnet?


45

Darüber habe ich eigentlich schon eine ganze Weile nachgedacht. Ich bin selbst keine englische Muttersprachlerin, aber ich habe jahrelange Programmiererfahrung und ich habe mich immer danach erkundigt. Warum heißt es Ausnahme, aber nicht Fehler, da es sich um Fehler handelt?

Es könnte PageNotFoundErrorstattdessen sein PageNotFoundException.


41
Nicht alle Ausnahmesituationen sind Fehler.
Andrew T Finnell

15
Es ist der Unterschied zwischen dem Ausweichen des Autos und dem Absturz des Autos.
Weltingenieur

6
Sprechen Sie nur über die Benennung der spezifischen Ausnahmeklassen? Dann beachten Sie, dass die in einigen Ökosystemen, werden genannt XYError- zum Beispiel in Python.

6
Wohlgemerkt, Java hat eine Error-Klasse, die von Throwable erbt. Weitere Informationen finden Sie unter docs.oracle.com/javase/1.4.2/docs/api/java/lang/Error.html . Möglicherweise möchten Sie auch die Kategorie "Direct Known Subclasses" überprüfen.
Luiscubal

Ich möchte sagen, dass dieses Rätsel nichts mit Englisch zu tun hat. Es ist eher eine logische Kategorisierung in der jeweils gesprochenen Sprache, in der Sie sich auskennen.
שינתיא אבישגנת

Antworten:


59

Sie müssen überhaupt keine Fehler sein. Die Tatsache, dass die Seite nicht vorhanden ist, ist möglicherweise eher eine interessante Tatsache als ein tatsächlicher Fehler. Ich gebe zu, dass sie fast die ganze Zeit als Fehler verwendet werden. Aber manchmal werden sie verwendet, um aus Schleifen auszubrechen, oder lassen Sie wissen, dass eine Zeichenfolge keine gültige Zahl ist. Sie können verwendet werden, um große Mengen nützlicher Daten zu speichern und zurückzugeben - als Teil einer ganz normalen Rendite. (Einige Sprachen sind mit ihren Ausnahmen etwas langsam, in diesem Fall ist es eine schlechte Idee, sie häufig zu werfen.) Theoretisch bedeutet eine Ausnahme lediglich "Keine normale Rückkehr durchführen, den Aufruf-Stack hochfahren, bis Sie jemanden finden, der interessiert ist in diesem."

Sogar eine Nullzeiger-Ausnahme bedeutet Ihnen möglicherweise nicht viel. Sie rufen den Code einer anderen Person auf und erhalten dann eine Null-Zeiger-Ausnahme, weil Sie wissen, dass sie in die Luft jagen kann. Sie drucken eine Nachricht mit dem Hinweis, wessen Fehler es ist, und machen weiter und erledigen Ihre Arbeit.


27
Obwohl die Verwendung von Ausnahmemechanismen als Kontrollfluss verwirrend sein kann und meiner Meinung nach allgemein verpönt ist.
ChaosPandion

11
@ChaosPandion: Kommt auf die Sprache / Kultur an.
Amara

11
@DocBrown: Ich habe einmal einen Sudoku-Löser geschrieben, der eine rekursive Suche durchführt, die zurückverfolgt, wenn die Lösung im aktuellen Versuch nicht gefunden und mit einem anderen Wert erneut versucht wird. und wenn eine Lösung gefunden wird, wird eine Ausnahme ausgelöst, die die Lösung enthält. Das Problem hierbei ist die "normale" Situation, und der Erfolg ist eine "außergewöhnliche" Situation. und da es im Solver mehrere Punkte gibt, an denen er sich selbst aufruft, müssten Sie ohne Ausnahme viele Boilerplates schreiben, um zu prüfen, ob ein Aufruf von einer erfolgreichen Suche oder von einer fehlgeschlagenen Suche zurückkehrt.
Lie Ryan

5
@ Falcon: Ja, Sie könnten einfach einen 'fertigen' Wert zurückgeben, das heißt, jedes Mal, wenn Sie wiederkehren, müssen Sie Folgendes tun: for (...) { if (func() == finished) { return finished; } else { itfailedsocheckanother(); }}Aber wenn man bedenkt, dass der Code mehrere Punkte enthält, an denen func () wiederkehrt, Die ausnahmelose Lösung wird immer hässlicher, je mehr Rekursionen hinzugefügt werden. Das nenne ich ein Cargo-Kult-Programm. Es simuliert im Grunde genommen Ausnahmen in einer Sprache, die bereits eine hat, weil der Kult-Anführer sagt "Du sollst keine Ausnahmen verwenden".
Lie Ryan

8
@ Falcon: Ah ... die Aktie "es sieht aus wie Goto" Argument, dass Argumente funktionieren, um zu sagen, Sie sollten keine Schleifen verwenden oder wenn Anweisungen oder Funktionsaufrufe, weil "sie alle wie gotos aussehen". Die Rückgabe eines Erfolgs mit Ausnahme ist nur dann eine WTF, wenn Sie eine Ausnahme mit Fehlern verknüpfen. Wenn ein Try-Catch-Block auf diese Weise verwendet wird, ist er für mich wie "ein Versprechen, nach einer langen Reise hierher zurückzukehren". Das Verhalten von try-except + throw ähnelt dem von function-calls + returns, mit Ausnahme von a viel längere Reisen, die möglicherweise einen sehr tiefen Call-Stack erfordern, wenn Sie die Suche nach einer Lösung abgeschlossen haben.
Lie Ryan

21

Der Mechanismus der Ausnahmen wird nicht immer verwendet, um Fehler zu signalisieren. Ausnahmen werden in ungewöhnlichen Situationen ausgelöst, in denen ein separater Codepfad für die Verarbeitung erforderlich ist, einschließlich Fehlern. Ein Benutzer, der einen Namen für eine Datei angibt, die nicht vorhanden ist, oder der in ein numerisches Feld anstelle einer Ziffer einen Buchstaben eingibt, ist beispielsweise eine Ausnahmesituation, die eine besondere Behandlung erfordert. Hierbei handelt es sich jedoch nicht um Fehler.

In einigen Programmierumgebungen wie Java werden spezielle ErrorObjekte bereitgestellt, um "echte Fehler" zu melden, Situationen, mit denen eine vernünftige Anwendung nicht versuchen sollte, umzugehen. Diese Objekte werden mit dem gleichen Mechanismus ausgeliefert, der für die Auslieferung von Ausnahmen verwendet wird, sie haben jedoch eine besondere Bedeutung für Signale, die nicht wiederhergestellt werden können.


6

Ich habe keine etymologischen Untersuchungen über die Ursprünge, aber ich kann verstehen, dass die Verwendung des Begriffs "Fehler" möglicherweise nicht in allen Situationen präzise ist. auch wie fastSharepointMaster erwähnt, ist es besser, sich den Fehler und die Ausnahme als getrennte Entitäten vorzustellen.

Wenn Sie sich in einer höheren Programmiersprache befinden, ist es sinnvoll anzunehmen, dass eine Ausnahme immer durch einen Fehler verursacht wird, obwohl ich auch dem blinkenlight zustimme, dass auch dann eine Ausnahme nicht immer die Folge eines Fehlers ist. Ich verwende zum Beispiel Ausnahmen, um Threads gemeinsam zu beenden.

Das erste Mal, dass ich den Begriff "Ausnahme" sah, war in der 80386-Montageanleitung. Ich erinnere mich, dass es mir sofort natürlich erschien, als ich es sah. Dies als Fehler zu bezeichnen, wäre nicht korrekt, da in der Assembly keine Fehler vorliegen. Es gibt einfach Bedingungen, mit denen der Prozessor nicht umgehen kann (wenn es sich um einen Fehler handelt - vom Programmierer, vom Benutzer oder vom System -, ist der Prozessor völlig unabhängig davon). Ich weiß nicht, ob der Begriff wirklich von Intel stammt oder nicht, aber vielleicht ...


3

In der Regel wird Exception verwendet, um ein Ereignis zu benennen, das nicht korrekt ist, aber wie eine out_of_rangeAusnahme in C ++ wiederhergestellt werden kann , die beim Zugriff auf ein Element in einem nicht vorhandenen Vektor oder Array ausgelöst wird. Natürlich ist ein solches Ereignis nicht korrekt, aber es sollte nicht bedeuten, dass Ihr gesamtes Programm abstürzt.

Andererseits werden Fehler normalerweise verwendet, um etwas zu benennen, das alles zum Absturz bringen sollte. Ein Stapelüberlauf ist beispielsweise ein Ereignis, das das Programm beenden sollte, da das Programm es intern nicht verarbeiten kann. Mit anderen Worten: Ein Fehler ist schwerwiegend, während eine Ausnahme vergleichsweise gering ist.


3

Ich denke, das hat mehr mit der "Evolution" der Fehlerbehandlung zu tun. Wenn in C / C ++ (vor dem Hinzufügen der Ausnahmebehandlung) eine Funktion fehlschlug, war die einzige Möglichkeit, dies festzustellen, der Rückgabewert (z HRESULT. B. in win32). Normalerweise haben Sie also die Beendigungscodes jedes Funktionsaufrufs abgefangen und eine Überprüfung durchgeführt. Dieser Ansatz macht den Code unübersichtlicher. Und oft vermeiden Entwickler es einfach, diese Prüfungen aus Faulheit hinzuzufügen.

Mit der Einführung der Ausnahmebehandlung hatten Entwickler nun zwei Möglichkeiten , einen Fehler auszulösen. Daher wurde das Wort "Ausnahme" verwendet, um Fehler von "Beendigungsstatus" -Fehlern zu unterscheiden. Nach einiger Zeit ist die Ausnahmebehandlung eine beliebte Methode zur Weitergabe von Fehlern geworden, da Code viel einfacher zu lesen und zu warten ist und es einen einzigen Ort geben kann, an dem Sie eine Fehlerbehandlungslogik haben können.


2

In Python werden sie als ABCError bezeichnet, z. B .: KeyError, IndexError

http://docs.python.org/library/exceptions.html

Ich denke, es hängt von der Sprache ab, die Sie verwenden.


4
Vergessen Sie nicht VB (klassisch, nicht. Net). On Error Goto wurde verwendet. Und die erstaunlichste Erfindung aller Zeiten "On Error Resume Next"
Kibbee

1
In Python sind Fehler eine Teilmenge der Ausnahmen. Es gibt vier Standardausnahmen, die von Exception erben, jedoch nicht von StandardError: StopIteration, GeneratorExit, KeyboardInterrupt und SystemExit.
Dirk Holsopple 20.08.12

1

Wenn ein Fehler auftritt, wird er entweder vom System oder von der aktuell ausgeführten Anwendung gemeldet, indem eine Ausnahme mit Informationen zum Fehler ausgelöst wird. Einmal ausgelöst, wird eine Ausnahme von der Anwendung oder vom Standard-Ausnahmebehandler behandelt.

Ein Fehler löst eine Ausnahme aus, in der der Fehler detailliert beschrieben wird. Wenn dies sinnvoll ist, ist also nicht alles ein Fehler, der eine Ausnahme darstellt. Beispielsweise sollte eine nicht-implementierte Ausnahme kein Fehler sein, sondern eine Ausnahme.

http://msdn.microsoft.com/en-us/library/system.exception.aspx


0

Bei der iOS / Mac-Programmierung gibt es sowohl Ausnahmen als auch Fehler in einer Sprache.

Zumindest in dieser Umgebung ist eine Ausnahme "nicht behebbar", während ein Fehler "behebbar" ist.

Zum Beispiel:

  • Wenn Sie ein Array mit 10 Elementen haben und versuchen, auf das Element bei Index 30 zuzugreifen, ist dies eine Ausnahme. Sie haben einen Fehler in Ihrer Programmierung gemacht.
  • Wenn Sie versuchen, eine URL herunterzuladen, aber keine Internetverbindung besteht, ist dies zu erwarten und Sie sollten dem Benutzer eine Nachricht präsentieren.

Ausnahmen führen in der Regel zu einem Absturz Ihrer App, während Fehler in der Regel zurückgegeben werden nilund ein Fehlerobjekt (das als Parameter der Referenzmethode zurückgegeben wird). Sie können Ausnahmen mit einem try / catch / finally-Block abfangen, es wird jedoch empfohlen, diese Sprachfunktion nicht zu verwenden. Wenn es möglich ist, eine Ausnahme auf irgendeine Weise zu beheben, sollten Sie überhaupt keine Ausnahme auslösen (Sie sollten zurückkehren) stattdessen ein Fehlerobjekt).


2
Nun, es ist völlig anders als das, was Exception und Errors für die anderen Entwickler bedeuten!
Tarik

Ich denke, jede Sprache ist anders. Objective-C / Cocoa ist eine der ältesten Sprachen im aktiven Sprachgebrauch (um 1983), also vielleicht etwas altmodisch. Wenn sich die Definition jedoch von einer Community zur nächsten ändert, ist es wichtig, dies zu wissen.
Abhi Beckert

0

Ein Fehler ist ein Fehler , der bei der Ausführung des Programms aufgetreten ist. Oft wird dies durch Auslösen einer Ausnahme behoben , aber

  • Es gibt nichts, was einen Programmierer dazu zwingt, einen Fehler durch Auslösen einer Ausnahme zu behandeln
  • Es gibt nichts, was einen Programmierer zwingt, Ausnahmen nur im Fehlerfall auszulösen.

Fehler ist ein semantisches Konzept: Es wird vom Programmierer oder Benutzer, der mit Erwartungen zum Programm kommt, angewendet, um den Unterschied zwischen ihren Erwartungen und der Realität zu beschreiben. Nur eine Person kann sagen, ob sich eine Routine in einem Fehlerzustand befindet oder nicht.

Eine Ausnahme ist ein syntaktisches Konzept: Es ist etwas im Programm selbst, unabhängig von den Erwartungen, die irgendjemand an das, was dieses Programm tun soll. Eine Routine löst entweder eine Ausnahme aus oder nicht, unabhängig davon, was jemand denkt.


0

Ausnahmen und Fehler sind unterschiedlich.

Ausnahmen sind Situationen, die ein Programm überwinden kann, z. B. wenn Sie versuchen, eine Datei zu öffnen, und diese nicht vorhanden ist. Fehler sind Situationen, in denen ein Programm nichts tun kann, z. B. ein Festplatten- oder ein RAM-Fehler.


0

Das Auslösen und Behandeln von Ausnahmen sind Kontrollflussfunktionen, und der Name der Ausnahme sollte der beabsichtigten Verwendung folgen. Der Designer von Code und API sollte gute und konsistente Benennungsschemata finden.

Die Antwort auf Ihre Frage lautet also: Es kommt auf den Kontext und die Perspektive an.


0

Ausnahmen entstanden als Verallgemeinerung von Fehlern. Die erste Programmiersprache, die einen Ausnahmemechanismus enthielt, war Lisp in den frühen 1970er Jahren. Es gibt eine gute Zusammenfassung in Ein Muster der Sprachentwicklung von Gabriel und Steele. Ausnahmen (die noch nicht als Ausnahmen bezeichnet wurden) ergaben sich aus der Notwendigkeit, das Verhalten eines Programms im Fehlerfall festzulegen. Eine Möglichkeit besteht darin, das Programm anzuhalten, dies ist jedoch nicht immer hilfreich. Lisp-Implementierungen hatten traditionell die Möglichkeit, den Debugger bei einem Fehler aufzurufen, aber manchmal wollten Programmierer die Fehlerbehandlung in ihr Programm aufnehmen. So hatten die Lisp-Implementierungen der 1960er Jahre die Möglichkeit zu sagen: "Tun Sie dies, und wenn ein Fehler auftritt, tun Sie dies stattdessen." Ursprünglich stammten Fehler aus primitiven Funktionen, aber Programmierer fanden es bequem, absichtlich einen Fehler auszulösen, um einen Teil des Programms zu überspringen und zum Fehlerbehandler zu springen.

1972 erschien die moderne Form der Ausnahmebehandlung in Lisp in MacLisp: throwund catch. Die Software Preservation Group listet eine Menge Material zu frühen Lisp-Implementierungen auf, einschließlich des MACLISP Reference Manual Revision 0 von David Moon . Die Grundelemente catchund throwsind in §5.3 S.43 dokumentiert.

catchist die LISP-Funktion für strukturierte nicht-lokale Exits. (catch x)wertet aus xund gibt seine Werte zurück, mit der Ausnahme, dass, wenn während der Auswertung von x (throw y)ausgewertet werden soll, catchsofort yohne weitere Auswertung zurückgegeben wird x.

catchkann auch mit einem zweiten, nicht bewerteten Argument verwendet werden, das als Tag zur Unterscheidung zwischen verschachtelten Fängen verwendet wird. (…)

throwwird catchals strukturierter nichtlokaler Austrittsmechanismus verwendet.

(throw x)wertet aus xund wirft den Wert auf den neuesten zurück catch.

(throw x <tag>)Löst den Wert von xzurück auf den zuletzt catchmit <tag>oder ohne Beschriftung gekennzeichneten Wert aus .

Der Fokus liegt auf dem nichtlokalen Kontrollfluss. Es ist eine Form von goto (ein nur aufwärts gerichtetes goto), das auch als Sprung bezeichnet wird . Die Metapher ist , dass ein Teil des Programms führt den Wert auf die Exception - Handler zurück, und die Exception - Handler Fänge dieser Wert und gibt ihn zurück.

Die meisten heutigen Programmiersprachen packen das Tag und den Wert in ein Ausnahmeobjekt und kombinieren den Fangmechanismus mit einem Handhabungsmechanismus.

Ausnahmen sind nicht unbedingt Fehler. Sie sind eine Möglichkeit, einen Codeblock und die umgebenden Blöcke zu verlassen und zu entkommen, bis ein Handler für die Ausnahme erreicht ist. Ob so etwas als "Fehler" im intuitiven Sinne aufgefasst wird, ist subjektiv.

Einige Sprachen unterscheiden zwischen den Begriffen "Fehler" und "Ausnahme". Einige Lisp-Dialekte müssen beispielsweise throweine Ausnahme auslösen (Kontrollfluss für Benutzer, der einen nicht lokalen Exit ausführen soll, der nicht anzeigt, dass etwas „falsch“ gelaufen ist) und signaleinen Fehler auslösen (der darauf hinweist, dass dies der Fall ist) Etwas ist „schief gelaufen“ und kann ein Debug-Ereignis auslösen.


-1

Sie werden feststellen, dass es in verschiedenen Programmiersprachen-Implementierungen unterschiedlich interpretiert wird. Wie dasblinkenlight sagte, ist dies eine Java-Sichtweise einer Abgrenzung zwischen Fehler und Ausnahme. In vielen Programmiersprachen sind Ausnahmen Verstöße, die behandelt oder in die Luft gesprudelt werden können, um sie an das höchstmögliche Codemodul weiterzuleiten. Fehler sind im Allgemeinen Situationen, in denen der Laufzeitcontainer Ihrer Sprache verarbeitet wird (und in vielen Fällen wird die Ausführung einfach angehalten).


-1

Ein Fehler ist immer ein Fehler. Eine Ausnahme ist ein Fehler im aktuellen Kontext. Das heißt, eine Ausnahme ist kontextsensitiv. Ein Beispiel für eine Ausnahme wäre das Hinzufügen eines ASCII-Zeichens "a" zu einer Ganzzahl "1". Ein Fehler kann so etwas wie die Verwendung eines undefinierten Operators wie "+!" in den meisten Sprachen.

In einigen Sprachen können Sie festlegen, wie Sie aus der Situation herauskommen sollen, wenn Sie dies wirklich möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.