Problem mit eigenem error handler

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit eigenem error handler

    Hi !

    Ich habe das "Beispiel 1" von php.net (http://uk2.php.net/manual/de/ref.errorfunc.php) genommen und wollte damit ein wenig rumexperimenten, aber gleich zu Beginn bin ich auf etwas gestoßen, das ich mir nicht erklären kann.

    Aus dem Beispiel habe ich nur die Funktion userErrorHandler genommen. Soweit sogut.

    Wenn ich nun z.B. im Skript $x = I_AM_NOT_DEFINED; mache, klappt das wunderbar. Datei wird erstellt und WARNING reingeschrieben. Wenn ich nun aber $x = 2 / 0; mache, erhalte ich im Browser die Fehlermeldung "Warning: Division by zero in Unknown on line 0" und die Funktion wird übergangen. Benutze ich für das gleiche bcdiv(), wird es wieder die Log Datei geschrieben.

    Wo ist der Fehler ?

    Gruß

    Le Cheffe

  • #2
    Der Fehler ist

    $x = 2/0;

    Du willst eine logische Rechenoperation durchführen und diesen Wert der Variable $x zuweisen. Soweit, so gut.

    ABER : 2/0 gibt es eigentlich nicht, das Ergebnis wäre nicht 0 sondern..... nichts

    2*0 == ok
    2-0 == ok
    2+0 == ok
    2/0 != ok

    Kommentar


    • #3
      @Tommy75: Dass das einen Fehler gibt, weiß er - er will ja damit sein eigenes Error Handling testen ...
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Na kommt schon. Kann denn keiner dazu was sagen ? Ist das Problem bisher nur bei mir aufgetreten ?

        btw wahsaga hat recht

        Kommentar


        • #5
          vll. handled php das nicht als einen Programmierfehler und daher funktioniert das nich, wie du es möchtest
          Sunshine CMS
          BannerAdManagement
          Borlabs - because we make IT easier
          Formulargenerator [color=red]Neu![/color]
          Herkunftsstatistik [color=red]Neu![/color]

          Kommentar


          • #6
            hmm,

            ich verwende eine ähnliche (die selbe) funktion, um errors abzufangen. konstrukte wie 2/0 werden abgefangen, php selbst erzeugt keine fehlermeldung => error_reporting(0) steht ja am anfang deines scriptes!?

            irgendetwas hast du falsch gemacht ...

            hast du den code 1:1 überneommen?
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              Hi !

              Um auf Nummer sicher zu gehen, poste ich hier mal den Code ...

              PHP-Code:
              <?php

              function NewErrorHandler($errno$errmsg$filename$linenum$vars) {


                      
              // timestamp for the error entry
                      
              $datetime date("Y-m-d H:i:s (T)");

                      
              // define an assoc array of error string
                      // in reality the only entries we should
                      // consider are E_WARNING, E_NOTICE, E_USER_ERROR,
                      // E_USER_WARNING and E_USER_NOTICE
                      
              $errortype = array (
                                          
              E_ERROR                => "Error",
                                          
              E_WARNING            => "Warning",
                                          
              E_PARSE                => "Parsing Error",
                                          
              E_NOTICE            => "Notice",
                                          
              E_CORE_ERROR        => "Core Error",
                                          
              E_CORE_WARNING        => "Core Warning",
                                          
              E_COMPILE_ERROR        => "Compile Error",
                                          
              E_COMPILE_WARNING    => "Compile Warning",
                                          
              E_USER_ERROR        => "User Error",
                                          
              E_USER_WARNING        => "User Warning",
                                          
              E_USER_NOTICE        => "User Notice",
                                          
              E_STRICT            => "Runtime Notice"
                                          
              );

                      
              // set of errors for which a var trace will be saved
                      
              $user_errors = array(E_USER_ERRORE_USER_WARNINGE_USER_NOTICE);

                      
              $err "<errorentry>\n";
                      
              $err .= "\t<datetime>" $datetime     "</datetime>\n";
                      
              $err .= "\t<errornum>" $errno "</errornum>\n";
                      
              $err .= "\t<errortype>" $errortype[$errno] . "</errortype>\n";
                      
              $err .= "\t<errormsg>" $errmsg "</errormsg>\n";
                      
              $err .= "\t<scriptname>" $filename "</scriptname>\n";
                      
              $err .= "\t<scriptlinenum>" $linenum "</scriptlinenum>\n";

                      
              $err .= "</errorentry>\n\n";

                      
              // for testing
                      // echo $err;

                      // save to the error log
                      
              error_log($err3"c:\error.log");

                  }
               
              //--------------------------------------------------// 


              error_reporting(0);

              $old_error_handler set_error_handler("NewErrorHandler");

              $t I_AM_NIX;

              print 
              20;

              trigger_error("Das ist ne USER_NOTICE",E_USER_NOTICE);

              require(
              "lalala");

              ?>
              Falls ich da keinen gravierenden Fehler reingebaut habe, wovon ich mal nicht ausgehe, dann vermute ich fast, dass es an der der Software (XAMPP 1.4.16) hängen wird. Nur leider kann ich da im Moment keine wirkliche Abhilfe schaffen.

              Gruß

              Le Cheffe
              Zuletzt geändert von Le_Cheffe; 27.10.2005, 14:01.

              Kommentar


              • #8
                @Le_Cheffe: FANG *Umbrüche zuwirft* << bau mal ein
                Sunshine CMS
                BannerAdManagement
                Borlabs - because we make IT easier
                Formulargenerator [color=red]Neu![/color]
                Herkunftsstatistik [color=red]Neu![/color]

                Kommentar


                • #9
                  Ich glaube dein Fehler liegt darin, dass du in $user_errors nicht den Error Typ drinnen hast, der für "Division Zero" "zuständig" ist. Mach mal alle rein, dann sollte es gehen, war jedenfalls bei mir so.
                  Sunshine CMS
                  BannerAdManagement
                  Borlabs - because we make IT easier
                  Formulargenerator [color=red]Neu![/color]
                  Herkunftsstatistik [color=red]Neu![/color]

                  Kommentar


                  • #10
                    Original geschrieben von Benny-one
                    Ich glaube dein Fehler liegt darin, dass du in $user_errors nicht den Error Typ drinnen hast, der für "Division Zero" "zuständig" ist.
                    Wie im ersten Posting steht, erzeugt der Versuch der Division durch Null ein Warning.

                    Und die sollte doch durch
                    PHP-Code:
                    // set of errors for which a var trace will be saved
                            
                    $user_errors = array(E_USER_ERRORE_USER_WARNINGE_USER_NOTICE); 
                    eigentlich auch mit abgedeckt sein(?).
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Original geschrieben von wahsaga
                      Wie im ersten Posting steht, erzeugt der Versuch der Division durch Null ein Warning.

                      Und die sollte doch durch
                      PHP-Code:
                      // set of errors for which a var trace will be saved
                              
                      $user_errors = array(E_USER_ERRORE_USER_WARNINGE_USER_NOTICE); 
                      eigentlich auch mit abgedeckt sein(?).
                      Sorry, diese Zeile ist noch ein Überbleibsel aus dem Originalscript von php.net und hat in meinem Fall nix zu sagen bzw. könnte ich die auch einfach weglassen. Es ging dabei, wie der Kommentar sagt, um einen Trace ...

                      Gruß

                      Le Cheffe

                      Kommentar


                      • #12
                        laß dir mal nach der division durch 0 den level der error_reporting ausgeben, welchen wert erhälst du da?
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          @hund: ich habs mal versucht, ich hab alle werte in den trace genommen aber die meldung kommt: Warning: Devsion...

                          PHP-Code:
                          <?php
                          // we will do our own error handling
                          error_reporting(0);

                          // user defined error handling function
                          function userErrorHandler($errno$errmsg$filename$linenum$vars
                          {
                              
                          // timestamp for the error entry
                              
                          $dt date("Y-m-d H:i:s (T)");

                              
                          // define an assoc array of error string
                              // in reality the only entries we should
                              // consider are E_WARNING, E_NOTICE, E_USER_ERROR,
                              // E_USER_WARNING and E_USER_NOTICE
                              
                          $errortype = array (
                                          
                          E_ERROR           => "Error",
                                          
                          E_WARNING         => "Warning",
                                          
                          E_PARSE           => "Parsing Error",
                                          
                          E_NOTICE          => "Notice",
                                          
                          E_CORE_ERROR      => "Core Error",
                                          
                          E_CORE_WARNING    => "Core Warning",
                                          
                          E_COMPILE_ERROR   => "Compile Error",
                                          
                          E_COMPILE_WARNING => "Compile Warning",
                                          
                          E_USER_ERROR      => "User Error",
                                          
                          E_USER_WARNING    => "User Warning",
                                          
                          E_USER_NOTICE     => "User Notice",
                                          
                          E_STRICT          => "Runtime Notice"
                                          
                          );
                              
                          // set of errors for which a var trace will be saved
                              
                          $user_errors = array(E_ERRORE_WARNINGE_PARSEE_NOTICEE_CORE_ERROR,
                          E_COMPILE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNINGE_USER_ERRORE_USER_NOTICE
                          E_USER_WARNING);
                              
                              
                          $err "<errorentry>\n";
                              
                          $err .= "\t<datetime>" $dt "</datetime>\n";
                              
                          $err .= "\t<errornum>" $errno "</errornum>\n";
                              
                          $err .= "\t<errortype>" $errortype[$errno] . "</errortype>\n";
                              
                          $err .= "\t<errormsg>" $errmsg "</errormsg>\n";
                              
                          $err .= "\t<scriptname>" $filename "</scriptname>\n";
                              
                          $err .= "\t<scriptlinenum>" $linenum "</scriptlinenum>\n";

                              if (
                          in_array($errno$user_errors)) {
                           
                          $err .= "\t<vartrace>".wddx_serialize_value($vars"Variables")."</vartrace>\n";
                              }
                              
                          $err .= "</errorentry>\n\n";
                              
                              
                          // for testing
                              // echo $err;

                              // save to the error log, and e-mail me if there is a critical user error
                              
                          echo $err;
                          }


                          $old_error_handler set_error_handler("userErrorHandler");

                          $some 1/0;

                          // Ausgabe: Warning: Division by zero in Unknown on line 0

                          ?>
                          Zuletzt geändert von Benny-one; 28.10.2005, 13:41.
                          Sunshine CMS
                          BannerAdManagement
                          Borlabs - because we make IT easier
                          Formulargenerator [color=red]Neu![/color]
                          Herkunftsstatistik [color=red]Neu![/color]

                          Kommentar


                          • #14
                            mit dem hier gehts

                            hi, mit dem code unten wird kein Warning ausgegeben...

                            PHP-Code:
                            <?php
                            function ErrorLogger($errno$errmsg$filename$linenum$vars
                            {
                            global 
                            $_language;
                            // timestamp for the error entry
                            $datetime date("Y-m-d H:i:s");

                            $errortype = array (
                                        
                            E_ERROR           => $_language['error'],
                                        
                            E_WARNING         => $_language['warning'],
                                        
                            E_PARSE           => $_language['parsing_error'],
                                        
                            E_NOTICE          => $_language['notice'],
                                        
                            E_CORE_ERROR      => $_language['core_error'],
                                        
                            E_CORE_WARNING    => $_language['core_warning'],
                                        
                            E_COMPILE_ERROR   => $_language['compile_error'],
                                        
                            E_COMPILE_WARNING => $_language['compile_warning'],
                                        
                            E_USER_ERROR      => $_language['user_error'],
                                        
                            E_USER_WARNING    => $_language['user_warning'],
                                        
                            E_USER_NOTICE     => $_language['user_notice'],
                                        
                            E_STRICT          => $_language['runtime_notice']
                                        );

                            // set of errors for which a var trace will be saved
                            $user_errors = array(E_ERRORE_WARNINGE_PARSEE_NOTICEE_CORE_ERROR
                            E_CORE_WARNING,
                                    
                            E_COMPILE_ERRORE_COMPILE_WARNINGE_USER_ERRORE_USER_WARNING,
                                    
                            E_USER_NOTICEE_STRICT);

                            $error .= '<table id="ErrorTable" width="100%" border="0">';
                            $error .= '<tr>';
                            $error .= '<td width="10%" id="ErrorTableHead">'.$errortype[$errno].'</td>';
                            $error .= '<td id="ErrorTableHead" align="right">'.$datetime.'</td>';
                            $error .= '</tr>';
                            $error .= '<tr>';
                            $error .= '<td width="10%" id="ErrorTableContent">'.$_language['datetime'].'</td>';
                            $error .= '<td id="ErrorTableContent">'.$datetime.'</td>';
                            $error .= '</tr>';
                            $error .= '<tr>';
                            $error .= '<td width="10%" id="ErrorTableContent">'.$_language['errornum'].'</td>';
                            $error .= '<td id="ErrorTableContent">'.$errno.'</td>';
                            $error .= '</tr>';
                            $error .= '<tr>';
                            $error .= '<td width="10%" id="ErrorTableContent">'.$_language['error_type'].'</td>';
                            $error .= '<td id="ErrorTableContent">'.$errortype[$errno].'</td>';
                            $error .= '</tr>';
                            $error .= '<tr>';
                            $error .= '<td width="10%" id="ErrorTableContent">'.$_language['message'].'</td>';
                            $error .= '<td id="ErrorTableContent">'.$errmsg.'</td>';
                            $error .= '</tr>';
                            $error .= '<tr>';
                            $error .= '<td width="10%" id="ErrorTableContent">'.$_language['filename'].'</td>';
                            $error .= '<td id="ErrorTableContent">'.$filename.'</td>';
                            $error .= '</tr>';
                            $error .= '<tr>';
                            $error .= '<td width="10%" id="ErrorTableContent">'.$_language['line'].'</td>';
                            $error .= '<td id="ErrorTableContent">'.$linenum.'</td>';
                            $error .= '</tr>';
                            $error .= '</table>';

                                
                            /*if (in_array($errno, $user_errors)) {
                                    $error .= "\t<pre>".wddx_serialize_value($vars, 0)."</pre>\n";
                                }*/
                                
                            echo $error;
                            }

                            error_reporting(0);
                            set_error_handler("ErrorLogger");
                            echo 
                            $ASD;
                            echo 
                            2/0;
                            echo 
                            "asd";
                            ?>
                            Aber hier hab ich das Problem, dass ein "header already send" fehler nicht angezeigt wird, der kommt nur, wenn ich den auskommentierten code /*if...*/ wieder freigebe, was ich nicht verstehe.
                            Zuletzt geändert von Benny-one; 29.10.2005, 14:31.
                            Sunshine CMS
                            BannerAdManagement
                            Borlabs - because we make IT easier
                            Formulargenerator [color=red]Neu![/color]
                            Herkunftsstatistik [color=red]Neu![/color]

                            Kommentar


                            • #15
                              Hi !

                              Etwas verspätet, aber immerhin eine "Lösung". Habe mir PHP 5.1 RC1 aufgespielt und mit dem gleichen Code wird nun auch endlich die "Division by zero" abgefangen. Ich hoffe einfach mal, dass die 5.1 final bald kommen wird, so dass ich die verwenden kann. Könnte ein Fehler in der 5.0.5 sein oder einfach nur ein Problem bei meiner Installation.

                              Gruß

                              Le Cheffe

                              Kommentar

                              Lädt...
                              X