heinetz: set_error_handler

Hallo Forum,

ich betreue ein recht komplexes PHP-Projekt, das zum Einen
Teil aus eigenen Scripten und zum Anderen aus mir unbekannten
Scripten besteht. Diese "Blackbox" wird schlicht includiert.
Ich möchte meine Errors in eine Datei schreiben. Dazu benutze
ich set_error_handler("mein_handler"). Nun weiss ich aber nicht,
was daraufhin mit den Fehlern, die die includierte Blackbox
produziert passiert.

Ich würde gerne meinen Errorhandler so einbauen, dass er nur
Fehler, die in Scripten innerhalb eines bestimmten Verzeichnisses
entstehen schreiben. Ist das möglich ?

danke für Tipps und

beste gruesse,
heinetz

  1. Hi!

    Ich würde gerne meinen Errorhandler so einbauen, dass er nur
    Fehler, die in Scripten innerhalb eines bestimmten Verzeichnisses
    entstehen schreiben. Ist das möglich ?

    Ja, aber diesen Filter musst du innerhalb deines Error-Handlers implementieren. In welcher Datei der Fehler aufgetreten ist, bekommst du ja mitgeteilt, so dass du darauf eine Bedingung ansetzen kannst.

    Lo!

    1. Hi,

      erstmal danke für die Tipps. Die Diskussion ist allerdings
      nun soweit forgeschritten, dass ich eher verwirrt bin und
      immernoch nicht genau weiss, was zu tun ist. Was ich mir für
      meinen Fall als grundsätzliche Lösung vostellen kann ist:

      function.restore-error-handler.php

      Im Moment sieht das ganze im Prinzip so aus:

      index.php:
      ---------------------------------------------------------------

        
      <?  
      include $blackbox.inc.php;  
        
      include $_content."includes/functions/my_errorhandler.inc.php";  
      include $_content."includes/mein_script.inc.php";  
      include $_content."includes/mein_zweites_script.inc.php";  
      ...  
      include $_content."includes/mein_zehntes_script.inc.php";  
      ?>  
        
      <html>  
       <body>  
        
      <?  
      $value = $BlackBox->unknown_function();  
      $other_value = $BlackBox->other_unknown_function();  
      ?>  
        
       </body>  
      </html>
      

      ---------------------------------------------------------------

      In my_errorhandler.inc.php sorge ich dafür, dass die Fehler
      so behandelt werden, wie darin definiert. Damit überschreibe
      ich aber m.E. ein u.U. in dem zuvor inkludierten $blackbox.inc.php
      möglicherweise definiertes Errohandling. Damit werden die Fehler,
      die später durch z.B. die mir unbekannte Methode unknown_function()
      verursacht werden, auf die von mir definierte Weise gehandhabt,
      was ich vermeiden möchte. Wenn ich restore_error_handler();
      richtig vertanden habe sieht die Lösung für meinen Fall so aus:

      index.php:
      ---------------------------------------------------------------

        
      <?  
      include $blackbox.inc.php;  
        
      include $_content."includes/functions/my_errorhandler.inc.php";  
      include $_content."includes/mein_script.inc.php";  
      include $_content."includes/mein_zweites_script.inc.php";  
      ...  
      include $_content."includes/mein_zehntes_script.inc.php";  
      restore_error_handler();  
      ?>  
        
      <html>  
       <body>  
        
      <?  
      $value = $BlackBox->unknown_function();  
      $other_value = $BlackBox->other_unknown_function();  
      ?>  
        
       </body>  
      </html>
      

      ---------------------------------------------------------------

      ... und restore_error_handler(); sorgt jetzt dafür, dass das
      Errorhandling bei allen Fehlern, die nach meinen inkludierten
      Skripten auftreten so gehandhabt werden, als hätte ich niemals
      ein eigenes Errorhandling definiert.

      Ist das so korrekt ?

      beste gruesse,
      heinetz

      1. Hi!

        In my_errorhandler.inc.php sorge ich dafür, dass die Fehler
        so behandelt werden, wie darin definiert. Damit überschreibe
        ich aber m.E. ein u.U. in dem zuvor inkludierten $blackbox.inc.php
        möglicherweise definiertes Errohandling.

        Das kannst du ja prüfen, weil dann was anderes als null zurückgegeben wird.

        include $blackbox.inc.php;

        include $_content."includes/functions/my_errorhandler.inc.php";
        include $_content."includes/mein_script.inc.php";
        include $_content."includes/mein_zweites_script.inc.php";
        ...
        include $_content."includes/mein_zehntes_script.inc.php";
        restore_error_handler();

        ... und restore_error_handler(); sorgt jetzt dafür, dass das
        Errorhandling bei allen Fehlern, die nach meinen inkludierten
        Skripten auftreten so gehandhabt werden, als hätte ich niemals
        ein eigenes Errorhandling definiert.

        Jein. Wenn du nur sofort ausführbaren Code inkludierst, mag das stimmen. Inkludierst du allerdings Funktionen und Klassen, um sie später (nach dem restore_error_handler()) aufzurufen, wirkt dein Error-Handling nicht mehr.

        Lo!

        1. hi,

          Das kannst du ja prüfen, weil dann was anderes als null zurückgegeben wird.

          sicher kann ich das prüfen. Aber ich wüsste nicht warum ich
          das prüfen müsste, statt mein Errorhandling pauschal zurück-
          zusetzen.

          Jein. Wenn du nur sofort ausführbaren Code inkludierst, mag das stimmen.

          allerdings ist das ganze genauso aufgebaut. in "meinen"
          inkludierten Scripten werden Variablen belegt, die dann
          ausserdem nur noch ausgegeben werden.

          beste gruesse,
          heinetz

          1. Hi!

            Das kannst du ja prüfen, weil dann was anderes als null zurückgegeben wird.
            sicher kann ich das prüfen. Aber ich wüsste nicht warum ich das prüfen müsste, statt mein Errorhandling pauschal zurückzusetzen.

            Müssen musst du das nicht, aber wenn es dich interessiert, ob das passiert, kannst du ebenda nachschauen.

            Jein. Wenn du nur sofort ausführbaren Code inkludierst, mag das stimmen.
            allerdings ist das ganze genauso aufgebaut. in "meinen" inkludierten Scripten werden Variablen belegt, die dann ausserdem nur noch ausgegeben werden.

            Warum hast du eigentlich einen Errorhandler implementiert? Warum interessieren dich die Fehler im Fremdcode nicht? Und warum willst du nur Teile deines Codes abdecken? Auch beim Ausgaben der Variableninhalte kann ein Fehler auftreten, beispielsweise dann, wenn sie aus irgend einem Grunde nicht gesetzt sind, und du darauf ungeprüft zugreifst, oder dich beim Namen vertippt hast.

            Lo!

            1. hi,

              Müssen musst du das nicht, aber wenn es dich interessiert, ob das passiert, kannst du ebenda nachschauen.

              schon verstanden. da sich hinter der blackbox ein ziemlich
              komplexes system verbirgt mit dem ich nichts zu tun habe,
              an dem ich auch nichts manipulieren kann, müssen mich fehler,
              die daraus resultieren nicht interessieren.

              Warum hast du eigentlich einen Errorhandler implementiert?

              damit Fehler, die in meinem Skripten entstehen, mir bekannt
              werden - nur mir - und ich sie ausräumen kann.

              Warum interessieren dich die Fehler im Fremdcode nicht? Und warum willst du nur Teile deines Codes abdecken?

              weil ich wie beschrieben nur meine eigenen Code beeinflussen kann.

              Auch beim Ausgaben der Variableninhalte kann ein Fehler auftreten, beispielsweise dann, wenn sie aus irgend einem Grunde nicht gesetzt sind, und du darauf ungeprüft zugreifst, oder dich beim Namen vertippt hast.

              schon klar. dass dabei keine Fehler auftreten, ist aber gewährleistet.

              gruesse,
              heinetz

              1. Hi!

                Warum interessieren dich die Fehler im Fremdcode nicht? Und warum willst du nur Teile deines Codes abdecken?
                weil ich wie beschrieben nur meine eigenen Code beeinflussen kann.

                Die zweite Frage wollte ich so verstanden wissen: Warum willst du nur einen Teil deines Codes aber nicht alles abdecken?

                Zur ersten: Du legst also die Flinte ins Korn und setzt lieber fremden Code unüberwacht ein, als in diesem Fehler zu finden, auf dass sie der Autor beseitigen kann?

                Auch beim Ausgaben der Variableninhalte kann ein Fehler auftreten, beispielsweise dann, wenn sie aus irgend einem Grunde nicht gesetzt sind, und du darauf ungeprüft zugreifst, oder dich beim Namen vertippt hast.

                schon klar. dass dabei keine Fehler auftreten, ist aber gewährleistet.

                Wie? Vier-Augen-Prinzip - in der Hoffnung, nichts übersehen zu haben? TDM - in der Hoffnung, alle Eventualitäten mit einem Testfall abgedeckt zu haben?

                Lo!

                1. Hi,

                  beim Autor des fremden Codes schlagen einfach Fehler, die in
                  meinem Code entstehen per Mail auf. Wie dessen Errormonitoring
                  funktioniert, kann ich nicht sagen. Was den daran nervt ist
                  weniger die Tatsache der Fehler an sich, sondern die Tatsache,
                  dass er von etwas unterrichtet wird, was ihn nicht interessiert.

                  Abgesehen davon, dass mich die Fehler interessieren und ich sie
                  daher beheben muss, möchte ich aber nun im ersten Schritt dafür
                  sorgen, das der nicht mehr mit meinen Fehlern konfrontiert wird.

                  Dafür kann ich mit dem setzen eines eigenen Errorhandlers sorgen,
                  habe aber dessen, wie auch immer geartetes Errormonitoring
                  möglicherweise ausgehebelt und das möchte ich vermeiden.

                  gruesse,
                  heinetz

                  1. Hi,

                    beim Autor des fremden Codes schlagen einfach Fehler, die in
                    meinem Code entstehen per Mail auf. Wie dessen Errormonitoring
                    funktioniert, kann ich nicht sagen. Was den daran nervt ist
                    weniger die Tatsache der Fehler an sich, sondern die Tatsache,
                    dass er von etwas unterrichtet wird, was ihn nicht interessiert.

                    Dann hätte er dieses Feature nicht implementieren sollen, bzw. sich selber drum kümmern sollen wie er es regelt, dass es nur seinen eigenen Code betrifft.

                    MfG ChrisB

                    --
                    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Hello,

    Du solltest auf jeden Fall darauf achten, ob die "Blackbox" selber einen Error-Handler setzt oder aber mit $php_errormsg arbeitet. Dann wäre die Funtion nämlich durch das Setezn deines Handlers gestört.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi!

      Du solltest auf jeden Fall darauf achten, ob die "Blackbox" selber einen Error-Handler setzt oder aber mit $php_errormsg arbeitet. Dann wäre die Funtion nämlich durch das Setezn deines Handlers gestört.

      Das kann man beim Aufruf von set_error_handler() durch Auswerten des Rückgabewertes herausfinden. Und "gestört" heißt in dem Fall: außer Kraft gesetzt.

      Lo!

      1. Hello,

        Du solltest auf jeden Fall darauf achten, ob die "Blackbox" selber einen Error-Handler setzt oder aber mit $php_errormsg arbeitet. Dann wäre die Funtion nämlich durch das Setezn deines Handlers gestört.

        Das kann man beim Aufruf von set_error_handler() durch Auswerten des Rückgabewertes herausfinden. Und "gestört" heißt in dem Fall: außer Kraft gesetzt.

        Nur fast getroffen :-)

        Gestört heißt, dass der zuständige Error-Handler außer Kraft gesetzt ist und ein falscher stattdessen angemeldet und demnach ausgeführt wird. Das führt dann sicherlich zu einem "gestörten Verhalten".

        Ähnliches gilt, wenn die Blackbox $php_errormsg benutzt für die qualifizierte Auswertung von Fehlern.

        Hier beginnt jetzt der Bereich, wo ich der OOP unter PHP die Vorteile nicht mehr absprechen würde :-) Je nach Objekt und der Vererbungslinie kann eine eigene Fehlerbehandlung sauber vereinbart werden.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi!

          Hier beginnt jetzt der Bereich, wo ich der OOP unter PHP die Vorteile nicht mehr absprechen würde :-) Je nach Objekt und der Vererbungslinie kann eine eigene Fehlerbehandlung sauber vereinbart werden.

          Nette Idee, das kenne ich aber bisher aus keiner anderen OOP-Sprache in der Form. Vermutlich braucht es in der Form keiner und das Exception-Konzept reicht für die meisten Fälle. Man will ja in der Regel nicht nur klassenspezifische Fehler behandeln, sondern auch Fehler, die überall auftreten können, beispielsweise Division durch Null oder I/O-Fehler. Dafür ist es besser spezielle Exception-Klassen abzuleiten. Bei Bedarf kann man sich ja immer noch extra für die eine Klasse(nhierarchie) eigene Exceptions definieren.

          Lo!

  3. Hi,

    vor und nach jeden Include der Blackbox-Elemente ein bischen
    Bassteln. Siehe auch:

    [kink:http://www.php.net/manual/de/function.restore-error-handler.php]

    1. Hi!

      vor und nach jeden Include der Blackbox-Elemente ein bischen Bassteln.

      Include sorgt nur dafür, dass der zu inkludierende Code an der Stelle in den inkludierenden Code eingefügt wird. Wenn du davor einen Error-Handler deaktivierst, ihn danach wieder aktivierst, und erst anschließend Funktionen aus dem inkludierten Code aufrufst, ist der Error-Handler aktiv und behandelt dessen Laufzeitfehler. Man müsste vor jedem Aufruf einer Funktion aus dem inkludierten Code den Error-Handler deaktivieren und anschließend wieder aktivieren. Oder man schreibt immer ein @ davor, dann muss der eigene Error-Handler das error_level abfragen und bei 0 den Fehler ignorieren. In dem Fall springt aber auch der PHP-Default-Handler nicht an.

      Lo!

  4. Hi,

    ich betreue ein recht komplexes PHP-Projekt, das zum Einen
    Teil aus eigenen Scripten und zum Anderen aus mir unbekannten
    Scripten besteht. Diese "Blackbox" wird schlicht includiert.
    Ich möchte meine Errors in eine Datei schreiben. Dazu benutze
    ich set_error_handler("mein_handler").

    Reicht dir dazu error_log nicht aus?

    Ich würde gerne meinen Errorhandler so einbauen, dass er nur
    Fehler, die in Scripten innerhalb eines bestimmten Verzeichnisses
    entstehen schreiben. Ist das möglich ?

    Obiges könntest du bspw. per .htaccess durchaus auf Verzeichnisebene konfigurieren; allerdings nicht so, wie du es vermutlich gerne hättest - bei Konfiguration auf Verzeichnisebene wird vom Verzeichnis des „Haupt-Scriptes” ausgegangen, in welchen Verzeichnissen per include eingebundene Scriptteile liegen, interessiert dabei nicht.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hello,

      Reicht dir dazu error_log nicht aus?

      Es geht oft auch um Laufzeitfehler, die das Laufzeitverhalten aktiv beeinflussen sollen. Da reicht es ja nicht, nachher erst im Logbuch nachzuschauen. Das muss ja zeitnah geschehen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de