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 PageNotFoundError
stattdessen sein PageNotFoundException
.
XYError
- zum Beispiel in Python.Antworten:
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.
quelle
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".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
Error
Objekte 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.quelle
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 ...
quelle
In der Regel wird Exception verwendet, um ein Ereignis zu benennen, das nicht korrekt ist, aber wie eine
out_of_range
Ausnahme 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.
quelle
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.
quelle
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.
quelle
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
quelle
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:
Ausnahmen führen in der Regel zu einem Absturz Ihrer App, während Fehler in der Regel zurückgegeben werden
nil
und 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).quelle
Ein Fehler ist ein Fehler , der bei der Ausführung des Programms aufgetreten ist. Oft wird dies durch Auslösen einer Ausnahme behoben , aber
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.
quelle
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.
quelle
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.
quelle
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:
throw
undcatch
. 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 Grundelementecatch
undthrow
sind in §5.3 S.43 dokumentiert.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
throw
eine Ausnahme auslösen (Kontrollfluss für Benutzer, der einen nicht lokalen Exit ausführen soll, der nicht anzeigt, dass etwas „falsch“ gelaufen ist) undsignal
einen Fehler auslösen (der darauf hinweist, dass dies der Fall ist) Etwas ist „schief gelaufen“ und kann ein Debug-Ereignis auslösen.quelle
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).
quelle
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.
quelle