pl: set_error_handler und Exception

problematische Seite

PDOExcepions werden bei mir aufgefangen:

        try{
            $cred = parse_ini_file($this->FILEDIR."/dbcredentials.ini",1);
            $cred = $cred['myweb'];
            $dbh = new PDO(sprintf("mysql:dbname=%s;host=%s", $cred['base'], $cred['host']),
                $cred['user'], $cred['pass'],
                array(
                    PDO::ATTR_TIMEOUT => 2,
                ));
            $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $dbh;
        }
        catch(PDOException $e){ dd("Keine Verbindung zur DB"); }

wobei dd("Keine Verbindung zur DB"); auch nur diesen Text ausgibt. Nun habe ich einen ErrorHandler gesetzt:

set_error_handler( function($errno, $errstr, $errfile, $errline){
    ob_get_clean();
    header("HTTP/1.1 502");
    header("Content-Type: text/plain");
    echo $errstr;
    die();
}, E_ALL);

Und seitdem wird nicht die PDOException ausgegeben sondern der hier anfallende $errstr. Ich halte das für einen Bug, denn meine Funktion dd() erzeugt ja keinen Fehler. Wenn das kein Bug ist, kann ich mir das try/catch auch schenken. Meinung?

MFG

  1. problematische Seite

    Hallo,

            try{
                ...
            }
            catch(PDOException $e){ dd("Keine Verbindung zur DB"); }
    

    wobei dd("Keine Verbindung zur DB"); auch nur diesen Text ausgibt. Nun habe ich einen ErrorHandler gesetzt:

    set_error_handler( function($errno, $errstr, $errfile, $errline){
        ...
    }, E_ALL);
    

    Und seitdem wird nicht die PDOException ausgegeben sondern der hier anfallende $errstr.

    die Beschreibung von set_error_handler() im Handbuch sagt leider nichts dazu, aber anscheinend hebelt der Error-Handler die try/catch-Methode aus.

    Ich halte das für einen Bug, denn meine Funktion dd() erzeugt ja keinen Fehler.

    Ähm, nein, aber die Exception, die vorher der catch-Zweig aufgefangen hat, ist jetzt vermutlich der Fehler, den der Error-Handler meldet.

    Wenn das kein Bug ist, kann ich mir das try/catch auch schenken. Meinung?

    Meinung: Ja, scheint so.
    Hast du alternativ mal set_exception_handler() angeschaut? Da heißt es zumindest klar und deutlich: "if an exception is not caught within a try/catch block". Möglicherweise ist das ein entscheidender Unterschied zu set_error_handler().

    Ciao,
     Martin

    --
    Frage an die Kollegin am Montagmorgen: "Na, wie war dein Wochenende?"
    Depressive Kollegin: "Hell, dunkel, hell, dunkel, Montag."
    1. problematische Seite

      Ok, PHP ist hier etwas eigenwillig, mann muss es halt nur wissen ;)

      Den exception_handler() kann ich mir schenken, denn die PDOException spuckt zuviele Informationen aus die ich nicht im Browser haben will. Deswegen ja mein try/cacth mit einer Lapidarmeldung.

      Aber so wie es aussieht macht set_error_handler() auch den try/catch Block überflüssig und zwar so, daß mein eigener errhandler greift. Wenn die DB nicht erreichbar ist, sieht das so aus:

      PDO::__construct(): [2002] Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle na (trying to connect via tcp://... 
      

      Da wird zwar der Hostname gezeigt, aber damit kann ich leben.

      MFG

    2. problematische Seite

      Tach!

      Und seitdem wird nicht die PDOException ausgegeben sondern der hier anfallende $errstr.

      die Beschreibung von set_error_handler() im Handbuch sagt leider nichts dazu, aber anscheinend hebelt der Error-Handler die try/catch-Methode aus.

      Das Handbuch sagt deshalb nichts dazu, weil sich set_error_handler() nicht um Exceptions kümmert. Ob mit oder ohne try/catch, der Custom Error Handler wird nicht aufgerufen. Ohne try/catch stirbt das Script mit einem Fatal Error wegen Uncaught PDOException.

      Ich halte das für einen Bug, denn meine Funktion dd() erzeugt ja keinen Fehler.

      Ähm, nein, aber die Exception, die vorher der catch-Zweig aufgefangen hat, ist jetzt vermutlich der Fehler, den der Error-Handler meldet.

      Nicht richtig vermutet. Wenn der Error Handler losläuft, dann aus anderem Grunde, aber nicht wegen der Exception.

      Hast du alternativ mal set_exception_handler() angeschaut? Da heißt es zumindest klar und deutlich: "if an exception is not caught within a try/catch block". Möglicherweise ist das ein entscheidender Unterschied zu set_error_handler().

      Zumindest läuft der Exception Handler los, wenn kein catch mit passendem Exception-Typ im Spiel ist.

      Wer auch immer den Error Handler aufruft, der gezeigte Code macht es jedenfalls nicht.

      dedlfix.

      1. problematische Seite

        Du hast recht, PDO::__construct() wirft gar keine Exception. Es hat mich nur irritiert, daß der Fehler beim Verbindungsaufbau im callback des error_handlers landet obwohl das im try-Block passiert.

        MFG