error_handler mit debug_backtrace()

  • geschlossen

  • corema
  • 1452 Aufrufe 2 Antworten

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

  • error_handler mit debug_backtrace()

    naben ihr lieben,
    ich war heute am schreiben und am schreiben, als mir ein fehler in die finger kam. und da ich den verursacher nicht sofort ausfindig machen konnte(was ja wohl häufiger vorkommt soll) dachte ich mir, dass es ganz nett wäre bei der erzeugung von eigenen fehlermeldung (z.b. trigger_error()) nicht nur die die zeile angegeben wird, in der ich trigger_error() aufrufe, sondern auch die zeile, in der die funktion aufgerufen wird, in der trigger_errorr aufgerufen wird.

    hat da jemand zufällig ein script "rumliegen"?

    gruß corema

    EDIT: ich habe da eine viel versprechende funktion gefunden: debug_backtrace()

    hat da einer vllt einen error-handler "rumliegen" der mit dieser function arbeitet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von corema () aus folgendem Grund: halb gelöst

  • Hi,
    hier habe ich ein Beispiel für dich: stuff.frostbitten.de/error.php (bzw. phps)

    Wird mit der Klasse alles mit ein error.tpl ausgegeben, in einem error.log gespeichert, unnütze Debug-Punkte entfernt, E_USER_NOTICE als SQL-Fehler behandelt und alles xHTML1.1 (+ valid html-Tabs :) )

    Gruß
    Broken Sword
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.
  • der sieht doch gar nicht mal so schlecht aus ;)
    ich hab hier mal einen geschrieben:

    handler:

    PHP-Quellcode

    1. function error_handler($errno , $errstr, $errfile = '', $errline = -1, $errcontext = array() ){
    2. switch($errno){
    3. case E_ERROR:
    4. case E_USER_ERROR:
    5. $msg = '<strong>Fatal Error</strong> called';
    6. break;
    7. case E_WARNING:
    8. case E_USER_WARNING:
    9. $msg = '<strong>Warning</strong> called';
    10. break;
    11. case E_NOTICE:
    12. case E_USER_NOTICE:
    13. $msg = '<strong>Notice</strong> called';
    14. break;
    15. }
    16. empty($errfile) or $msg.= ' in <i>'.$errfile.'</i>';
    17. $errline == -1 or $msg.= ' on line <b>'.$errline.'</b>';
    18. $msg.= ': </i>'.$errstr;
    19. $msg = '<p>'.$msg.'</p>';
    20. if (ini_get("display_errors"))
    21. print($msg);
    22. if (ini_get('log_errors'))
    23. error_log(sprintf("PHP %s: %s in %s on line %d", $errors, $errstr, $errfile, $errline));
    24. if($errno == E_ERROR || $errno == E_USER_ERROR) die();
    25. return true;
    26. }
    Alles anzeigen

    function, die den handler aufruft (zusätzlich zu trigger_error())

    PHP-Quellcode

    1. function create_error($msg, $errno = E_USER_NOTICE, $backtrace = false, $show_args = false){
    2. $debug = debug_backtrace();
    3. $errorcall = $debug[0];
    4. if($backtrace){
    5. unset($debug[0]);
    6. $msg.= '<ul>';
    7. foreach($debug as $step){
    8. if($show_args && count($step['args']) > 0){
    9. foreach($step['args'] as $s){
    10. $s = var_export($s,true);
    11. }
    12. $args = implode(', ',$step['args']);
    13. }
    14. $msg.= '<li><strong>'.$step['function'].'</strong> ('.$args.') called in <i>'.$step['file'].'</i> on line <strong>'.$step['line'].'</strong></li>';
    15. }
    16. $msg.= '</ul>';
    17. }
    18. else{
    19. }
    20. $context = $GLOBALS;
    21. error_handler($errno, $msg, $errorcall['file'], $errorcall['line'], $context);
    22. }
    Alles anzeigen


    und die ausgabe:

    PHP-Quellcode

    1. $alter_error_handler = set_error_handler("error_handler");
    2. function a(){
    3. b(aeda);
    4. }
    5. function b(){ c(129,312,'strimng'); }
    6. function c(){
    7. create_error('wunderbarere fehlermeldung mit backtrace', E_USER_ERROR, true, true);
    8. }
    9. a();
    10. trigger_error('fehlermeldung auch über den normalen weg');
    11. ?>
    Alles anzeigen

    wer was dran zu mecker hat: immer raus damit! verbessern kann man sich immer ;)