Ausnahmen werden geworfen - sie sollen gefangen werden. Fehler können im Allgemeinen nicht behoben werden. Nehmen wir zum Beispiel an, Sie haben einen Codeblock, der eine Zeile in eine Datenbank einfügt. Es ist möglich, dass dieser Aufruf fehlschlägt (doppelte ID) - Sie möchten einen "Fehler" haben, der in diesem Fall eine "Ausnahme" ist. Wenn Sie diese Zeilen einfügen, können Sie so etwas tun
try {
$row->insert();
$inserted = true;
} catch (Exception $e) {
echo "There was an error inserting the row - ".$e->getMessage();
$inserted = false;
}
echo "Some more stuff";
Die Programmausführung wird fortgesetzt, da Sie die Ausnahme "abgefangen" haben. Eine Ausnahme wird als Fehler behandelt, sofern sie nicht abgefangen wird. Damit können Sie die Programmausführung fortsetzen, nachdem sie ebenfalls fehlgeschlagen ist.
Errors are generally unrecoverable
<- eigentlich stimmt das nicht wirklich.E_ERROR
undE_PARSE
sind die beiden häufigsten nicht behebbaren Fehler (es gibt einige andere), aber die überwiegende Mehrheit der Fehler, die Sie in dev sehen, sind behebbar (E_NOTICE
,E_WARNING
et al.). Leider ist die Fehlerbehandlung von PHP ein komplettes Durcheinander - alle möglichen Dinge lösen unnötigerweise Fehler aus (zum Beispiel die überwiegende Mehrheit der Dateisystemfunktionen). Im Allgemeinen sind Ausnahmen "der OOP-Weg", aber leider verwenden einige der nativen OOP-APIs von PHP Fehler anstelle von Ausnahmen :-(Throwable
Schnittstelle), was eine viel ausdrucksstärkere und absolutere Möglichkeit bietet, beide Real zu unterscheiden und richtig zu übergeben Probleme undError
VS und den Nachkommen vonException
.Ich
set_error_handler
gehe normalerweise zu einer Funktion, die den Fehler aufnimmt und eine Ausnahme auslöst, so dass ich, was auch immer passiert, nur Ausnahmen habe, mit denen ich mich befassen muss. Nicht mehr@file_get_contents
nur schön und ordentlich versuchen / fangen.In Debug-Situationen habe ich auch einen Exception-Handler, der eine asp.net-ähnliche Seite ausgibt. Ich poste dies auf der Straße, aber wenn ich dazu aufgefordert werde, werde ich später eine Beispielquelle veröffentlichen.
bearbeiten:
Wie versprochen habe ich einen Teil meines Codes ausgeschnitten und eingefügt, um ein Beispiel zu erstellen. Ich habe das Folgende in einer Datei auf meiner Workstation gespeichert. Sie können die Ergebnisse hier NICHT MEHR sehen (da der Link unterbrochen ist).
quelle
Die Antwort verdient es, über den Elefanten im Raum zu sprechen
Fehler ist die alte Methode zur Behandlung einer Fehlerbedingung zur Laufzeit. Normalerweise ruft der Code etwas auf,
set_error_handler
bevor er Code ausführt. In Anlehnung an die Tradition der Assemblersprache unterbricht. So würde ein BASIC-Code aussehen.Es war schwer sicherzustellen, dass
set_error_handler
dies mit dem richtigen Wert aufgerufen wurde. Und noch schlimmer, es könnte ein Aufruf an eine separate Prozedur erfolgen, die den Fehlerbehandler ändern würde. Außerdem wurden Anrufe häufig mitset_error_handler
Anrufen und Handlern durchsetzt. Es war leicht für Code, schnell außer Kontrolle zu geraten. Die Ausnahmebehandlung wurde durch die Formalisierung der Syntax und Semantik dessen, was guter Code wirklich tat, behoben.Keine separate Funktion oder das Risiko, den falschen Fehlerbehandler aufzurufen. Der Code befindet sich jetzt garantiert am selben Ort. Außerdem erhalten wir bessere Fehlermeldungen.
PHP hatte früher nur eine Fehlerbehandlung, als sich viele andere Sprachen bereits zum bevorzugten Modell für die Ausnahmebehandlung entwickelt hatten. Schließlich implementierten die Hersteller von PHP die Ausnahmebehandlung. Wahrscheinlich unterstützten sie alten Code, behielten jedoch die Fehlerbehandlung bei und boten eine Möglichkeit, die Fehlerbehandlung wie eine Ausnahmebehandlung aussehen zu lassen. Abgesehen davon gibt es keine Garantie dafür, dass ein Code den Fehlerbehandler möglicherweise nicht zurücksetzt, was genau das war, was die Ausnahmebehandlung bieten sollte.
Endgültige Antwort
Fehler, die vor der Implementierung der Ausnahmebehandlung codiert wurden, sind wahrscheinlich immer noch Fehler. Neue Fehler sind wahrscheinlich Ausnahmen. Es gibt jedoch kein Design oder keine Logik, bei denen es sich um Fehler und Ausnahmen handelt. Es basiert nur auf dem, was zum Zeitpunkt der Codierung verfügbar war, und der Präferenz des Programmierers, der es codiert.
quelle
Eine Sache, die hier hinzugefügt werden muss, ist die Behandlung von Ausnahmen und Fehlern. Für den Anwendungsentwickler sind sowohl Fehler als auch Ausnahmen "schlechte Dinge", die Sie aufzeichnen möchten, um mehr über die Probleme Ihrer Anwendung zu erfahren - damit Ihre Kunden auf lange Sicht eine bessere Erfahrung haben.
Es ist daher sinnvoll, einen Fehlerbehandler zu schreiben, der das Gleiche tut wie Sie für Ausnahmen.
quelle
Wie in anderen Antworten angegeben, ist die Einstellung des Fehlerbehandlers auf den Ausnahmewerfer der beste Weg, um Fehler in PHP zu behandeln. Ich benutze ein etwas einfacheres Setup:
Bitte beachten Sie die
error_reporting()
Überprüfung, damit der@
Bediener weiterarbeitet. Es ist auch nicht erforderlich, eine benutzerdefinierte Ausnahme zu definieren. PHP hat dafür eine nette Klasse.Der große Vorteil des Auslösens von Ausnahmen besteht darin, dass der Ausnahme eine Stapelverfolgung zugeordnet ist, sodass leicht festgestellt werden kann, wo das Problem liegt.
quelle
Betreff: "Aber was genau ist der Unterschied zwischen einem Fehler und einer Ausnahme?"
Es gibt viele gute Antworten auf die Unterschiede hier. Ich werde nur etwas hinzufügen, über das noch nicht gesprochen wurde - Leistung. Dies gilt insbesondere für den Unterschied zwischen dem Auslösen / Behandeln von Ausnahmen und dem Behandeln eines Rückkehrcodes (entweder Erfolg oder Fehler). In PHP bedeutet dies normalerweise das Zurückgeben von
false
odernull
, aber sie können detaillierter sein, z. B. beim Hochladen von Dateien: http://php.net/manual/en/features.file-upload.errors.php Sie können sogar ein Exception-Objekt zurückgeben !Ich habe einige Performance-Läufe in verschiedenen Sprachen / Systemen durchgeführt. Im Allgemeinen ist die Ausnahmebehandlung etwa 10.000-mal langsamer als die Suche nach einem Fehlerrückgabecode.
Wenn es also unbedingt die Ausführung beenden muss, bevor es überhaupt begonnen hat - nun, Sie haben kein Glück, weil es keine Zeitreisen gibt. Ohne Zeitreise sind Rückkehrcodes die schnellste verfügbare Option.
Bearbeiten:
PHP ist stark für die Ausnahmebehandlung optimiert. Tests in der Praxis zeigen, dass das Auslösen einer Ausnahme nur 2-10x langsamer ist als das Zurückgeben eines Werts.
quelle
Ich denke, die Antwort, die Sie suchen, ist die;
Fehler sind das Standardmaterial, an das Sie gewöhnt sind, z. B. das Echo einer nicht vorhandenen $ -Variablen.
Ausnahmen gelten nur ab PHP 5 und treten beim Umgang mit Objekten auf.
Um es einfach zu halten:
Ausnahmen sind die Fehler, die beim Umgang mit Objekten auftreten. Mit der try / catch-Anweisung können Sie jedoch etwas dagegen tun. Sie wird ähnlich wie die if / else-Anweisung verwendet. Versuchen Sie dies zu tun, wenn das Problem keine Rolle spielt, tun Sie dies.
Wenn Sie eine Ausnahme nicht "abfangen", wird sie zu einem Standardfehler.
Fehler sind die grundlegenden PHP-Fehler, die normalerweise Ihr Skript anhalten.
Try / Catch wird häufig zum Herstellen von Datenbankverbindungen wie PDO verwendet. Dies ist in Ordnung, wenn Sie das Skript umleiten oder etwas anderes tun möchten, wenn die Verbindung nicht funktioniert. Wenn Sie jedoch nur die Fehlermeldung anzeigen und das Skript stoppen möchten, benötigen Sie sie nicht. Die nicht erfasste Ausnahme wird zu einem schwerwiegenden Fehler. Sie können auch eine standortweite Fehlerbehandlungseinstellung verwenden.
hoffentlich hilft das
quelle
quelle
Ausnahmen werden absichtlich durch Code mit einem Wurf ausgelöst, Fehler ... nicht so sehr.
Fehler entstehen durch etwas, das normalerweise nicht behandelt wird. (E / A-Fehler, TCP / IP-Fehler, Nullreferenzfehler)
quelle
Ich beabsichtige, Ihnen eine äußerst ungewöhnliche Diskussion über die Fehlerkontrolle zu geben.
Ich habe vor Jahren einen sehr guten Fehlerbehandler in eine Sprache eingebaut, und obwohl sich einige Namen geändert haben, sind die Prinzipien der Fehlerverarbeitung heute dieselben. Ich hatte ein speziell entwickeltes Multitasking-Betriebssystem und musste in der Lage sein, Datenfehler auf allen Ebenen ohne Speicherlecks, Stapelwachstum oder Abstürze zu beheben. Was folgt, ist mein Verständnis, wie Fehler und Ausnahmen funktionieren müssen und wie sie sich unterscheiden. Ich werde nur sagen, dass ich nicht verstehe, wie die Interna von try catch funktionieren, also rate ich bis zu einem gewissen Grad.
Das erste, was bei der Fehlerverarbeitung unter der Decke passiert, ist das Springen von einem Programmstatus in einen anderen. Wie geht das? Ich werde dazu kommen.
In der Vergangenheit sind Fehler älter und einfacher, und Ausnahmen sind neuer und etwas komplexer und leistungsfähiger. Fehler funktionieren einwandfrei, bis Sie sie in die Luft sprengen müssen. Dies entspricht der Übergabe eines schwierigen Problems an Ihren Vorgesetzten.
Fehler können Zahlen sein, wie Fehlernummern, und manchmal mit einer oder mehreren zugeordneten Zeichenfolgen. Wenn beispielsweise ein Fehler beim Lesen von Dateien auftritt, können Sie möglicherweise melden, was es ist, und möglicherweise ordnungsgemäß fehlschlagen. (Hay, es ist ein Schritt nach dem Absturz wie früher.)
Über Ausnahmen wird nicht oft gesagt, dass Ausnahmen Objekte sind, die auf einem speziellen Ausnahmestapel liegen. Es ist wie ein Rückgabestapel für den Programmablauf, enthält jedoch einen Rückgabestatus nur für Fehlerversuche und -fänge. (Früher nannte ich sie ePush und ePop, und? Abort war ein bedingter Wurf, der ePop und Wiederherstellung auf dieses Niveau brachte, während Abort ein voller Würfel oder Exit war.)
Am unteren Rand des Stapels befinden sich die Informationen zum ersten Aufrufer, dem Objekt, das den Status kennt, als der äußere Versuch gestartet wurde, häufig als Ihr Programm gestartet wurde. Darüber hinaus ist die nächste Ebene auf dem Stapel, wobei up die Kinder und down die Eltern sind, das Ausnahmeobjekt des nächsten inneren try / catch-Blocks.
Wenn Sie einen Versuch in einen Versuch einfügen, stapeln Sie den inneren Versuch über den äußeren Versuch. Wenn im inneren Versuch ein Fehler auftritt und entweder der innere Fang ihn nicht verarbeiten kann oder der Fehler in den äußeren Versuch geworfen wird, wird die Steuerung an den äußeren Fangblock (Objekt) übergeben, um zu prüfen, ob er den Fehler behandeln kann, d. H. Ihr Vorgesetzter.
Dieser Fehlerstapel ist also wirklich in der Lage, den Programmfluss und den Systemstatus zu markieren und wiederherzustellen. Mit anderen Worten, er ermöglicht es einem Programm, den Rückgabestapel nicht zum Absturz zu bringen und Dinge für andere (Daten) durcheinander zu bringen, wenn etwas schief geht. Auf diese Weise wird auch der Status anderer Ressourcen wie Speicherzuweisungspools gespeichert und diese können nach Abschluss des Abfangens bereinigt werden. Im Allgemeinen kann dies eine sehr komplizierte Sache sein, und deshalb ist die Ausnahmebehandlung oft langsam. Im Allgemeinen muss einiges an Status in diese Ausnahmeblöcke gehen.
Ein Try / Catch-Block setzt also einen Zustand, in den er zurückkehren kann, wenn alles andere durcheinander kommt. Es ist wie bei einem Elternteil. Wenn unser Leben durcheinander gerät, können wir in den Schoß unserer Eltern zurückfallen und sie werden alles wieder in Ordnung bringen.
Hoffe ich habe dich nicht enttäuscht.
quelle
Sie können diesen Kommentar hinzufügen
quelle
Sobald set_error_handler () definiert ist, ähnelt der Fehlerhandler dem von Exception. Siehe Code unten:
quelle