error_handler in custom Exception "umbiegen"

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • error_handler in custom Exception "umbiegen"

    Hallo zusammen.

    Ich schlage mich zur Zeit mit einem OOP Problem bei PHP 5.3 rum.
    Mein Ziel ist es, für eine komplexe Anwendung, den PHP Standard Error Handler in eine eigene Exception Klasse um zu biegen.
    Den dafür nötigen Code habe ich auf php.net bereits gefunden.
    Allerdings scheint hier etwas nicht zu stimmen, da der PHP Kompiler einen Fatal Error auswirft.

    Hier mal der Code für den Error Handler und die Custom Exceptions:

    Quellcode

    1. // wandelt PHP eigene Fehlermeldungen in Exceptions der Klasse ErrorException um
    2. set_error_handler(create_function('$a, $b, $c, $d', 'throw new CoreException($b, 0, $a, $c, $d);'), E_ALL);
    3. // Benutzerdefinierte Exceptions
    4. class DBException extends Exception { }
    5. class CoreException extends Exception { }
    6. class MoecoException extends Exception { }
    7. class PortalException extends Exception { }


    Hier die entsprechende Fehlermeldung aus dem Event Log vom ZendServer:

    Quellcode

    1. Wrong parameters for Exception([string $exception [, long $code [, Exception $previous = NULL]]])
    2. __lambda_func() at /var/www/moecoportal/core/CustomExceptions.php(4) : runtime-created function : 1 Show File
    3. __lambda_func()
    4. main() at /var/www/moecoportal/core/CoreInit.php : 6 Show File


    Ich habe schon alles mögliche versucht um die Sache mit den falschen Parametern in den Griff zu bekommen, aber bisher hat nichts geholfen.
    Vielleicht sieht hier ja jmd. direkt das Problem / den Fehler!

    Grüße,
    GhostScripter
    In a world without walls and fences, who needs windows and gates?

    Kommando-Klappspaten - BFBC2
  • Hi,

    deine CoreExceeption nimmt zu viele Parameter entgegen.

    Quellcode

    1. public Exception::__construct() ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )


    Der Konstruktor erwartet höchstens 3 Parameter.


    da du deine Variablen mit a,b,c,d benennst kann ich nur raten (nutze lieber aussagekräftige Namen)

    Quellcode

    1. set_error_handler(create_function('$a, $b, $c, $d', 'throw new CoreException($b, 0);'), E_ALL);


    oder (die meiner Meinung nach übersichtlichere Schreibweise)

    Quellcode

    1. set_error_handler(function($a, $b, $c, $d) {throw new CoreException($b, 0);}), E_ALL);
  • Hi vince,

    vielen Dank für Deine Antwort.
    Leider war ich auch schon so weit (aufgrund der Fehlermeldung), das die Parameterzahl nicht stimmt.

    Ich habe mir das Konstrukt noch einmal angesehen und festgestellt, das in dem Beispiel das ganze auf eine ErrorException umgebogen wird.

    Normalerweise sind meine Variablen mit sprechenden Bezeichnern versehen, bei diesem Fall habe ich aber lediglich die Bezeichnungen aus dem Beispiel von php.net übernommen.

    Nachdem ich das ganze jetzt auf die PHP eigene ErrorException umgebogen habe scheint das Parameterproblem behoben zu sein.
    Allerdings werden keine Exceptions geworfen, wenn PHP Fehlermeldungen auftreten...

    Quellcode

    1. try {
    2. require_once('CoreConfig.cfg.php');
    3. // for Init Debug only
    4. $definedConstants = get_defined_constants(true);
    5. echo '<pre>';
    6. print_r($definedConstants['user']);
    7. echo '</pre>';
    8. // ##############
    9. } catch (ErrorException $ee) {
    10. $ee->getMessage();
    11. }
    Alles anzeigen


    Wenn ich nun den Namen der einzubindenden Datei auf eine nicht existierende ändere, so wird keine Exception geworfen.
    Ich erhalte lediglich folgende Meldungen:

    Quellcode

    1. Fatal PHP Error
    2. main() [function.require]: Failed opening required 'CoreConfig.scfg.php' (include_path='.:/usr/local/zend/share/ZendFramework/library:/usr/local/zend/share/pear')
    3. Error Type: E_COMPILE_ERROR


    Wenn ich das mit dem ErrorHandler und der Exception richtig verstanden habe, dann müssten aber doch alle PHP eigenen Fehlermeldungen als ErrorException geworfen werden?!
    In a world without walls and fences, who needs windows and gates?

    Kommando-Klappspaten - BFBC2
  • Hi,

    GhostScripter schrieb:

    Ich habe mir das Konstrukt noch einmal angesehen und festgestellt, das in dem Beispiel das ganze auf eine ErrorException umgebogen wird.

    ah Ok.


    GhostScripter schrieb:

    Wenn ich das mit dem ErrorHandler und der Exception richtig verstanden habe, dann müssten aber doch alle PHP eigenen Fehlermeldungen als ErrorException geworfen werden?!

    Ne, leider nicht.

    Die folgenden Fehlertypen können nicht von einer benutzerdefinierten Funktion behandelt werden: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING und die meisten E_STRICT, die in der Datei ausgelöst werden, in der set_error_handler() aufgerufen wird.
    Quelle: de2.php.net/manual/de/function.set-error-handler.php
  • Hi vince,

    vielen Dank für die Antwort.
    Das ist das alte Problem mit dem genauen lesen :(

    Habe zwar im Netz was gefunden, wie man sich mit ob_start(), ob_get_contents() und ob_end_flush() einen eigenen "Error Handler" für alle "nicht Exception Fehler" bauen kann. Aber solchen Krücken gegenüber bin ich vorsichtig!

    Wie gesagt, danke für die Hilfe, ich close das dann hier mal!

    Grüße,
    GhostScripter
    In a world without walls and fences, who needs windows and gates?

    Kommando-Klappspaten - BFBC2