Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem mit eignem Error-Handler

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Problem mit eignem Error-Handler

    Hallo,

    ich nutze in meinem Script einen eigenen Error-Handler und bei der Template Engine Smarty kommt es zu einem Fehler. Im Forum (von Smarty) findet man dazu das der Error-Handler "falsch" arbeitet weil der Befehl ein "@" für Fehlerunterdrückung davor hat.

    Nun meine Frage: Wie kann ich im Error-Handler prüfen ob der Fehler mit einem @ unterdrückt werden soll?

    Gruß
    nBassCom


  • #2
    Ich denke, hier liegt ein Mißverständnis vor, der Fehler-Kontroll-Operator schaltet nur kurzzeitig die Ausgabe von Meldungen auf dem Bildschirm, allerdings transparent für den error handler (der bekommt vom @ Zeichen nichts mit).

    '@' evaluiert zu folgendem Code (in etwa):

    PHP-Code:
    $old error_reporting(0);
    ini_set('display_errors'0);
    .. 
    Anweisung ..
    ini_set('display_errors'1);
    error_reporting($old); 
    Wichtig ist noch, das die Ausgabe von Fehlern über die Funktion trigger_error() abläuft - denn ein normales "echo" kann der @ Operator nicht unterdrücken...
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Hm ... So wie du das sagst habe ich das verstanden aber was ich nicht verstehe:

      PHP-Code:
      if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file$params['filename'])) {
              
      // On platforms and filesystems that cannot overwrite with rename() 
              // delete the file before renaming it -- because windows always suffers
              // this, it is short-circuited to avoid the initial rename() attempt
              
      @unlink($params['filename']);
              @
      rename($_tmp_file$params['filename']);
          } 
      Erzeugt bei dem "unlink" einen Fehler mit No-Such File or Directory ... Wieso?

      Kommentar


      • #4
        Google ist dein Freund (oder die Forumssuche):

        Häufige Fehlermeldungen - Warning: fopen() - No such file or directory

        Wolf29
        while (!asleep()) sheep++;

        Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

        Kommentar


        • #5
          edit: argl... völlig am Thema vorbeigeredet

          Hast du dort deinen eigenen error handler implementiert? Wenn ja, wie?
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Zitat von lstegelitz Beitrag anzeigen
            Ich denke, hier liegt ein Mißverständnis vor, der Fehler-Kontroll-Operator schaltet nur kurzzeitig die Ausgabe von Meldungen auf dem Bildschirm, allerdings transparent für den error handler (der bekommt vom @ Zeichen nichts mit).
            Nein, soweit ich weiß unterdrückt der @-Operator nicht die Ausgabe von Fehlermeldungen, sondern den Fehler an sich. Bei jeder Benutzung von @ wird temporär das error_reporting auf 0 gesetzt, und dann nach der Ausführung des Befehls wieder auf den vorherigen Wert.

            Zitat von nBassCom Beitrag anzeigen
            Erzeugt bei dem "unlink" einen Fehler mit No-Such File or Directory ... Wieso?
            Wenn es nicht am @ liegt - dann vermutlich, weil dein Error-Handler eben diese Fehlerart nicht handelt.

            Kommentar


            • #7
              Zitat von ChrisB Beitrag anzeigen
              Nein, soweit ich weiß unterdrückt der @-Operator nicht die Ausgabe von Fehlermeldungen, sondern den Fehler an sich. Bei jeder Benutzung von @ wird temporär das error_reporting auf 0 gesetzt, und dann nach der Ausführung des Befehls wieder auf den vorherigen Wert.
              Vielleicht meinen wir ja dasselbe, drücken es nur anders aus
              Hier der Auszug aus dem Manual, auf den ich mich bezog:
              Warnung

              Zum gegenwärtigen Zeitpunkt deaktiviert der "@" Fehler-Kontrolloperator die Fehlermeldungen selbst bei kritischen Fehlern, die die Ausführung eines Skripts beenden. Unter anderem bedeutet das, wenn Sie "@" einer bestimmten Funktion voranstellen, diese aber nicht zur Verfügung steht oder falsch geschrieben wurde, Ihr PHP-Skript einfach beendet wird, ohne Hinweis auf die Ursache.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Wie ChrisB bereits schrieb, wird mit jedem @ in der INI der error_reporting Wert auf 0 gesetzt. Daher ist ein @ auch langsam und man sollte es wenn möglich vermeiden.

                PHP-Code:
                public static function userErrorHandler($intErrorNo$strError$strFile ''$intLine 0, array $arrContext = array())
                {    
                    
                /**
                     * Faengt das @ Zeichen ab
                     */
                    
                if(ini_get('error_reporting') === '0') return true;

                    ...

                DevBlog|3D Online-Shopping|Xatrium

                Kommentar


                • #9
                  Zitat von lstegelitz Beitrag anzeigen
                  Vielleicht meinen wir ja dasselbe, drücken es nur anders aus
                  Nein, deine Formulierung war falsch.
                  Hier der Auszug aus dem Manual, auf den ich mich bezog:
                  Ja, da steht aber was anderes, als was du sagtest.

                  Kommentar


                  • #10
                    Dann verstehe ich nicht, was du sagst:
                    Zitat von ChrisB Beitrag anzeigen
                    Nein, soweit ich weiß unterdrückt der @-Operator nicht die Ausgabe von Fehlermeldungen, sondern den Fehler an sich. Bei jeder Benutzung von @ wird temporär das error_reporting auf 0 gesetzt, und dann nach der Ausführung des Befehls wieder auf den vorherigen Wert.
                    Was heisst "unterdrückt den Fehler an sich"?
                    Der Fehler tritt doch in jedem Fall auf
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Das Erzeugen einer Fehlermeldung wird dadurch unterbunden (aber eben nicht nur die Ausgabe auf dem Bildschirm, wie du schriebst) - der Fehler an sich tritt trotzdem auf, ja. Und wenn er nicht fatal ist, dann wird einfach weiter gemacht, als ob nichts gewesen wäre - das sagt die von dir zitierte Stelle im Manual aus.

                      Kommentar


                      • #12
                        Zitat von Tiberius Beitrag anzeigen
                        Wie ChrisB bereits schrieb, wird mit jedem @ in der INI der error_reporting Wert auf 0 gesetzt. Daher ist ein @ auch langsam und man sollte es wenn möglich vermeiden.

                        PHP-Code:
                        public static function userErrorHandler($intErrorNo$strError$strFile ''$intLine 0, array $arrContext = array())
                        {    
                            
                        /**
                             * Faengt das @ Zeichen ab
                             */
                            
                        if(ini_get('error_reporting') === '0') return true;

                            ...

                        Oder allgemeingültiger, um die vollständige error_reporting Einstellung zu berücksichtigen und nicht nur den Fall 0 (Achtung, einfaches & für BITWISE AND)
                        PHP-Code:
                        if (!($errno error_reporting())) return false
                        ich gebe an dieser Stelle false zurück um zur normalen Fehlerbehandlung zurückzukehren.

                        Aus der Doku zu set_error_handler:
                        Vergessen Sie bei der Implementation auf keinen Fall, dass auf diese Weise die standardmäßige PHP-Fehlerbehandlung vollkommen umgangen wird! Die Einstellungen der Funktion error_reporting() haben keine Auswirkung, und Ihre eigene Fehlerbehandlungsroutine wird ohne Rücksicht darauf aufgerufen. Sie können jedoch immer noch den aktuellen Wert von error_reporting lesen und entsprechend handeln. Es ist besonders zu beachten, dass dieser Wert 0 sein wird, falls die Anweisung, die den Fehler verursacht hat, mit dem @ Fehler-Kontroll-Operator versehen ist.
                        @fschmengler - @fschmengler - @schmengler
                        PHP Blog - Magento Entwicklung - CSS Ribbon Generator

                        Kommentar


                        • #13
                          fab, $errno und eine bitweise Prüfung hat damit nichts zu tun. Es geht in der Situation um den INI Wert "error_reporting" und dieser ist, sofern mit @ unterdrückt oder deaktiviertem reporting, ein simpler String "0"
                          DevBlog|3D Online-Shopping|Xatrium

                          Kommentar


                          • #14
                            Das lässt sich wie in meinem Beispiel aber auch ohne ini_get prüfen, da der Wert den error_reporting() zurückgibt in dem Fall eben 0 ist. Mmn sollte auch in eigenen Fehlerbehandlungen ruhig das error_reporting richtig interpretiert werden und das ist eben nicht nur der Sonderfall '0'
                            @fschmengler - @fschmengler - @schmengler
                            PHP Blog - Magento Entwicklung - CSS Ribbon Generator

                            Kommentar

                            Lädt...
                            X