Fortsetzen von PHP in das Ausführungsskript nach der Ausnahmebedingung

9

Ich habe ein PHP-Skript, sagen wir während der Ausführung der Skripts eine Ausnahme auslöst. Ich möchte, dass meine PHP-Datei dort fortgesetzt wird, wo sie aufgehört hat (wo sie die Ausnahme ausgelöst hat).

Soll ich den gleichen Ausführungscode in den "catch" -Teil des Codes schreiben?

Zum Beispiel, sagen wir mal, verbindet sich mit mySQL es scheitert für die Verbindung Zeitüberschreitung

%Vor%     
MCHam 19.12.2012, 15:17
quelle

4 Antworten

22

Zunächst sollte klargestellt werden, dass eine Ausnahme nur dann fatal ist, wenn sie nicht gefangen wird . Wenn Sie eine Ausnahme abfangen, hält nicht die Skriptausführung an. Es stoppt lediglich den Stapelrahmen im try-Block und übergibt die Kontrolle an den catch-Block. Von dort wird das Skript weiterhin normal ausgeführt.

Wenn wir die Ausnahme hier abfangen, setzen wir die normale Skriptausführung fort, nachdem die Ausnahme abgefangen wurde ...

%Vor%

Was Sie vielleicht wollen, ist ein Exception-Handler . Um einen Ausnahme-Handler zu verwenden, damit Sie nicht jede Ausnahme in try / catch blocks behandeln müssen, können Sie Folgendes tun:

%Vor%

Bearbeiten: Nachdem ich Ihre Frage geklärt habe, sollte ich Ihnen mitteilen, dass Sie zwar keine Ausnahmebehandlung wünschen, Sie aber überhaupt keine Ausnahmen verwenden möchten. Was Sie versuchen zu tun, erfordert nicht, Ausnahmen zu werfen. Setzen Sie PDO nicht in den Ausnahme-Modus, wenn Sie nur den Fehler so behandeln wollen. Eine Ausnahme sollte nur verwendet werden, um außergewöhnliche Fehler zu behandeln. Der springende Punkt einer Ausnahme ist, sicherzustellen, dass Sie Ihr Versprechen halten. Zum Beispiel, wenn Ihre Funktion verspricht, dass sie immer ein PDOStatement-Objekt zurückgibt und es einen Fall gibt, in dem das unmöglich ist, dann ist es sinnvoll, eine Ausnahme auszulösen. Dadurch weiß der Anrufer, dass wir einen Punkt erreicht haben, an dem wir unser Versprechen nicht halten können.

Was Sie wollen, ist die grundlegende Fehlerbehandlung ...

%Vor%     
Sherif 19.12.2012, 15:31
quelle
3

Benutze PHP 4/5 register_shutdown_function.

Doc hier: Ссылка

    
gf4gs56dg4sd56s 21.08.2013 15:39
quelle
3

Ich gehe davon aus, dass Sie die Ausnahme in der Funktion, die geworfen wird, nicht verarbeiten können. Wenn Sie fortfahren möchten, wo Ihre Ausnahme ausgelöst wurde, müssen Sie dort die Ausnahme behandeln. Alles andere ist schlechtes Codieren, was für Sie oder irgendjemanden, der an dem Projekt arbeitet, Verwirrung stiftet. Wir lassen die Exception in den Baum gehen, weil wir sie aufgrund von Problemen mit dem Geltungsbereich nicht selbst behandeln können.

Was Ihr Beispiel betrifft, auf das ich eingehen werde. Sie sagen, dass die Operation nicht fortgesetzt werden kann, da keine Verbindung hergestellt werden kann. In Wirklichkeit wollen wir die Funktion nicht eklatant wiederholen, weil wir im Wesentlichen einen Hangpoint zum kontinuierlichen Testen der Verbindung erzeugen werden, so dass wir einen Catch-Block weiter oben im Baum verwenden, wo wir den Benutzer benachrichtigen und entscheiden können, was wir tun wollen . Dabei können wir catch-Blöcke an den richtigen Stellen verwenden, um Daten zu speichern, damit wir die Daten wiederherstellen und zu einem späteren Zeitpunkt ausführen können. In Wirklichkeit wollen wir an einem Punkt vor dem try Block aufgehen.

Dies wird Ihnen einen viel klareren Ausführungspfad geben. Manchmal muss man eine Funktion / Methode neu überdenken, damit sie eine Sache und eine Sache richtig macht.

Um die Antwort einfach und unverblümt auf Ihre Frage zu setzen. Nein, es ist eine schlechte Idee, die try (ed) -Funktion im catch-Block aufzurufen und der einfache Grund ist, dass Sie nicht lange einen try-Block haben, um dort eine Ausnahme zu fangen. Ausnahmen führen zu einer sinnvolleren Fehlerbehandlung und geben dann nur wahr und falsch als Rückgabe zurück. Es bedeutet jedoch, dass Sie den ganzen Kreis damit umgehen müssen.

Nun zu einem alternativen Beispiel ... Angenommen, wir haben mehrere Server, mit denen wir eine Verbindung herstellen können, und Sie wollten die Liste ausführen, in der Sie try / catch in eine Schleife einfügen würden bereinigen, bevor Sie die nächste Schleife ausführen. Wenn eine andere Ausnahme auftritt, werden wir die Ausnahme (erneut) werfen. Der richtige Weg, um das zu erreichen, wonach du suchst, wäre so.

%Vor%     
bgrohs 20.07.2014 06:05
quelle
0

Sie können möglicherweise den finally-Teil des try catch verwenden, wenn Sie keine Ausnahme in Ausführung erhalten.

%Vor%     
jaudette 19.12.2012 15:23
quelle

Tags und Links