Thorsten Steffen: "die" unter perl funktioniert nicht

Hi,
ich benutze den Perl-Interpreter Perl-5.00502-mswin32-x86 unter NT4.0SP5 unter Apache 1.3.9 . Wenn ich in einem Script den Befehl
die "Can't execute the query: $sth->errstr\n";
benutze, bricht das Script zwar ab, die Fehlermeldung wird aber nicht ausgegeben.

Woran liegt das ?

  1. Hallo!

    Woran liegt das ?

    Man unterscheidet bei den Ausgaben eines kommandozeilenorientierten Programms/Scriptes "normale" Ausgaben und Fehlerausgaben. Das, was ein Perl-Script alles so normal mit print ausgibt, wird an die Standardausgabe (STDOUT) geschickt. In der Tat ist
        print "foo";
    unter Perl nur eine Abkuerzung fuer
        print STDOUT "foo";

    Fehlermeldungen werden jedoch an die Standardfehlerausgabe (STDERR) geschickt, damit man sie getrennt vom normalen Output abfangen und umleiten kann. Auf die Fehlerausgabe schreibt man mit
        print STDERR "foo";

    Somit kann man unter einem richtigen Betriebssystem ein Script z.B. so aufrufen:
        perl myscript.pl  1> output.txt  2> errors.txt
    um in output.txt die normalen Ausgaben zu sammeln und in errors.txt die Fehlermeldungen. Startet man ein Programm ohne Umleitungsangabe, kommen beide Kanaele auf der Konsole (Bildschirm, Terminal or whatever) raus, deswegen merkt man dort die Unterscheidung nicht.

    Der Webserver nimmt nun alles, was ueber STDOUT kommt, und schickt es als CGI-Ergebnis zum Browser. Das, was ueber STDERR kommt, schreibt er jedoch ins Error-Logfile. Beim Apache auf Win heisst die defaultmaessig logs/error.log unterhalb vom ServerRoot.

    Lange Rede, kurzer Sinn: die() schreibt auf STDERR, und somit wird die Fehlermeldung nicht im Browser zu lesen sein, sondern im Errorlog.

    Calocybe

    1. Hi,
      erstmal danke für die ausführliche Antwort. Wie richte ich es nun am besten ein, daß Fehlermeldungen auch auf der Website ausgegeben werden ?
      Erst ein normaler print und dann ein "die" ?

      Gruß
      Thorsten

      Hallo!

      Woran liegt das ?

      Man unterscheidet bei den Ausgaben eines kommandozeilenorientierten Programms/Scriptes "normale" Ausgaben und Fehlerausgaben. Das, was ein Perl-Script alles so normal mit print ausgibt, wird an die Standardausgabe (STDOUT) geschickt. In der Tat ist
          print "foo";
      unter Perl nur eine Abkuerzung fuer
          print STDOUT "foo";

      Fehlermeldungen werden jedoch an die Standardfehlerausgabe (STDERR) geschickt, damit man sie getrennt vom normalen Output abfangen und umleiten kann. Auf die Fehlerausgabe schreibt man mit
          print STDERR "foo";

      Somit kann man unter einem richtigen Betriebssystem ein Script z.B. so aufrufen:
          perl myscript.pl  1> output.txt  2> errors.txt
      um in output.txt die normalen Ausgaben zu sammeln und in errors.txt die Fehlermeldungen. Startet man ein Programm ohne Umleitungsangabe, kommen beide Kanaele auf der Konsole (Bildschirm, Terminal or whatever) raus, deswegen merkt man dort die Unterscheidung nicht.

      Der Webserver nimmt nun alles, was ueber STDOUT kommt, und schickt es als CGI-Ergebnis zum Browser. Das, was ueber STDERR kommt, schreibt er jedoch ins Error-Logfile. Beim Apache auf Win heisst die defaultmaessig logs/error.log unterhalb vom ServerRoot.

      Lange Rede, kurzer Sinn: die() schreibt auf STDERR, und somit wird die Fehlermeldung nicht im Browser zu lesen sein, sondern im Errorlog.

      Calocybe

      1. Hi,

        erstmal danke für die ausführliche Antwort. Wie richte ich es nun am besten ein, daß Fehlermeldungen auch auf der Website ausgegeben werden ?
        Erst ein normaler print und dann ein "die" ?

        use CGI::Carp 'fatalsToBrowser';

        Cheatah

        1. Wie richte ich es nun am besten ein, daß Fehlermeldungen auch auf der Website ausgegeben werden ?

          use CGI::Carp 'fatalsToBrowser';

          Holla, das kringt großartig!

          Kann ich dann wirklich direkt mit "die()" Meldungen zum Browser schicken, oder muß ich zusätzlich noch einen HTTP-Header davorsetzen, damit es nicht kracht?

          1. use CGI::Carp 'fatalsToBrowser';

            Holla, das kringt großartig!

            Kann ich dann wirklich direkt mit "die()" Meldungen zum Browser schicken, oder muß ich zusätzlich noch einen HTTP-Header davorsetzen, damit es nicht kracht?

            Das war auch mir neu, hab's aber sofort ausprobiert und bin begeistert: Funktioniert ohne HTTP-Header und ohne alles. Alle Fehlermeldungen erscheinen im Browser...

            Vielen Dank Cheatah!

            MfG,
            Martin