PHP Try-Catch funktioniert nicht

Lesezeit: 3 Minuten
try     
{
    $matrix = Query::take("SELECT moo"); //this makes 0 sense

    while($row = mysqli_fetch_array($matrix, MYSQL_BOTH)) //and thus this line should be an error
    {

    }

    return 'something';
}
catch(Exception $e)
{
    return 'nothing';   
}

Anstatt jedoch nur einen Teil zu fangen und zurückzukehren nothing es zeigt eine Warnung Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given in der Zeile beginnend mit while. Ich bin nie auf die Idee gekommen, Ausnahmen in PHP zu verwenden, habe sie aber häufig in C# verwendet, und es scheint, dass sie in PHP anders funktionieren, oder wie immer fehlt mir etwas Offensichtliches.

  • Hier sind einige wie Ihre Frage: stackoverflow.com/questions/1241728/can-i-try-catch-a-warning

    – Estefano Salazar

    11. September 2012 um 20:53 Uhr

  • Duplizieren: stackoverflow.com/questions/1241728/can-i-try-catch-a-warning

    – Westseite

    11. September 2012 um 20:53 Uhr

  • Lesen Sie dies phpmaster.com/error-handling-in-php

    – Vascowhite

    11. September 2012 um 20:58 Uhr

  • @SirDarius – Interessanter und lesenswerter Link. Vielen Dank 🙂

    – Andrius Naruševičius

    11. September 2012 um 20:58 Uhr


Benutzer-Avatar
Philipp

Sie können Warnungen/Fehler nicht mit Try-Catch-Blöcken behandeln, da sie keine Ausnahmen sind. Wenn Sie Warnungen/Fehler behandeln möchten, müssen Sie Ihren eigenen Fehlerhandler bei registrieren set_error_handler.

Aber es ist besser, dieses Problem zu beheben, weil Sie es verhindern könnten.

  • Aufbauend auf dieser Antwort könnten Sie set_error_handler einfach so einstellen, dass PHP-Fehler erfasst und eine Ausnahme ausgegeben werden. An diesem Punkt funktioniert Ihr Try-Catch. Ich bin sicher, Sie können Google nach etwas Passendem suchen.

    – Mike Brant

    11. September 2012 um 20:58 Uhr

  • Zum Auslösen von Ausnahmen sollte set_error_handler in Kombination mit ErrorException (eingebaute Klasse speziell für diese Verwendung) verwendet werden.

    – Sauerstoff

    28. Februar 2013 um 12:06 Uhr

  • Ich mache jetzt seit ein paar Jahren Vollzeit PHP und wusste das nicht einmal.

    – Kapitän Hypertext

    5. Juli 2016 um 18:01 Uhr

  • Du kannst nicht verhindern, dass Benutzer falsche Authentifizierungsdaten verwenden imap_open Also nein, du kannst es nicht verhindern.

    – John

    15. November 2021 um 4:19 Uhr

Ausnahme ist nur die Unterklasse von Throwable. Um einen Fehler abzufangen, können Sie versuchen, einen der folgenden Schritte auszuführen:

try {

    catch (\Exception $e) {
       //do something when exception is thrown
}
catch (\Error $e) {
  //do something when error is thrown
}

ODER umfassendere Lösung

try {

catch (\Exception $e) {
   //do something when exception is thrown
}
catch (\Throwable $e) {
  //do something when Throwable is thrown
}

Übrigens: Java hat ein ähnliches Verhalten.

  • ich benutzte \Exception Anstatt von Exception und es hat funktioniert. Können Sie erläutern, wie ein \ (Schrägstrich) vorher Exception macht hier einen großen Unterschied?

    – Shashanth

    19. Februar 2020 um 8:28 Uhr


  • @Shashanth mit Exception ohne Schrägstrich geht davon aus, dass Sie ein haben use Exception; Anweisung oben, oder verwenden Sie keine Namensräume, die \ lässt es im globalen PHP-Namespace aussehen, sodass es ein PHP abfängt Exception und alle darauf basierenden Klassen – offizielle Dokumentation: php.net/manual/en/class.exception.php

    – Sandra

    7. Juli 2020 um 17:33 Uhr


  • In modernem PHP ist bei der Verwendung von Namespaces die Einbeziehung des ‘ \ ‘ unerlässlich.

    – Jahmic

    19. Mai 2021 um 7:26 Uhr


  • Genius, du hast meinen Tag gerettet!

    – w461

    21. Oktober 2021 um 8:43 Uhr

In PHP ist eine Warnung keine Ausnahme. Im Allgemeinen wäre es am besten, eine defensive Codierung zu verwenden, um sicherzustellen, dass das Ergebnis Ihren Erwartungen entspricht.

Welp, leider ist dies das Problem mit PHP. Try/Catch-Anweisungen fangen Ausnahmen ab, aber was Sie erhalten, ist ein PHP-Fehler der alten Schule.

Sie müssen einen Fehler wie diesen abfangen mit:
http://php.net/manual/en/function.set-error-handler.php

Entweder das, oder überprüfen Sie, ob $matrix ein mysqli_result-Objekt ist, bevor Sie mysqli_fetch_array ausführen.

PHP generiert eine Warnung, keine Ausnahme. Warnungen können nicht abgefangen werden. Sie ähneln eher Compiler-Warnungen in C#.

1179690cookie-checkPHP Try-Catch funktioniert nicht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy