1211chef: perl - fatals to browser

hallo erstmal wieder. war lange nicht hier und hab lange nichts mehr programmiert.

früher benutzte ich immer use CGI::Carp qw(fatalsToBrowser); um mir scriptfehler auf den browser schreiben zu lassen. jetz hab ich nen neuen provider und da funktionierts nicht mehr.

hab irgendwo gelesen dass "fatals to browser" nur bis perl-vers. 2 läuft? ich hab jetzt die version 5.16.3 drauf.

meine frage: was ist das einfachste mittel dass ich mir wieder wie gewohnt die fehlermeldungen auf den browser schreiben lassen kann?

  1. was ist das einfachste mittel dass ich mir wieder wie gewohnt die fehlermeldungen auf den browser schreiben lassen kann?

    Du machst genau das was CGI::Carp macht: Mögliches Exceptions (fatal error) auffangen damit das Programm nicht abstürzt. Und das machst Du mit try/catch: Alles was kritisch ist (also Dein ganzer Code) kommt in den tryblock und im catchblock gibtst Du $@ aus unter dem header text/plain.

    MFG

    1. hallo, kannst du bitte 1-2 schritte früher anfangen, bin ziemlich raus aus der thematik. kannst du mir ein beispiel geben?

      1. Ok, Beispiel:

        #!/usr/bin/perl
        
        use strict;
        use warnings;
        
        # Alle Warnungen werfen Exceptions
        $SIG{__WARN__} = sub { die @_ };
        
        print eval{ # try
            # alle Prozesse zum Erzeugen
            # der Response, bei Fehlern wird
            # eine Exception geworfen
            header().content();
        }           # catch
        || "Content-Type: text/plain; Charset=UTF-8\n\n$@";
        
        
        sub header{
          "Content-Type: text/html; Charset=UTF-8\n\n";    
        }
        
        sub content{
          local $/ = undef;
          <DATA>
        }
        
        __DATA__
        <!doctype html>
        <header>
          <title> Titel der Seite </title>
        </header>
        <html>
        <body>
            <p>Asdf usw.</p>
        </body>
        </html>
        

        AEG.

        PS: Zum Testen wirf mal im oberen Teil eine ex wie die 123 oder die "ex\n" un guck mal was dann im Browser rauskommt.

        1. hab zum testen einfach mal ne variable definiert und das "my" weggelassen. also anstatt "my $foo;" einfach nur "$foo". dein script kackt ohne explizite fehlermeldung ab und bringt nur das übliche: "internal server error".

          da sollte jetz aber stehen "fehler in zeile x bei strict subs, foo.pl" oder so ähnlich.

          ps: wieso läuft "fatals to browser eigentlich nimmer? die ausgegebenen fehlermeldungen haben mir immer ausgereicht um schnell das bug zu finden. ist das sicher dass es nur bis 2.0 läuft oder ist vll. an der serverconfig einfach nur irgendwas in schieflage?

          seitdem ich beim neuen bin ist eh alles bissi konfus.

          1. Ein eval{}Block fängt Exceptions auf, Tippfehler und grob fahrlässige Programmierfehler nicht. MFG

            1. ja dann brauch ich ne andere lösung like "fatals to browser"

              1. füge diesen Block hinzu:

                BEGIN{
                    $SIG{__DIE__} = sub{
                        print "Content-Type: text/plain; Charset=UTF-8\n\n@_" 
                    };
                };
                

                MFG

      2. Wenn HTML::Template vefügbar ist, tete mal das hier

        #!/usr/bin/perl
        
        use strict;
        use warnings;
        use HTML::Template;
        
        # Alle Warnungen werfen Exceptions
        $SIG{__WARN__} = sub { die @_ };
        
        print eval{ # try
            # alle Prozesse zum Erzeugen
            # der Response, bei Fehlern wird
            # eine Exception geworfen
            header().content();
        }           # catch
        || "Content-Type: text/plain; Charset=UTF-8\n\n$@";
        
        
        sub header{
          "Content-Type: text/html; Charset=UTF-8\n\n";    
        }
        
        sub content{
          local $/ = undef;
          my $content = <DATA>;
        
          my $tt = HTML::Template->new(
            scalarref         => \$content, 
            die_on_bad_params => 1,
            vanguard_compatibility_mode => 1
          );
          
          $tt->param({
            title => "Der Titel meiner Seite",
            body  => "Körper zeigen..."
          });
          return $tt->output;
        }
        
        __DATA__
        <!doctype html>
        <header>
          <title> %title% </title>
        </header>
        <html>
        <body>
            <p> %body% </p>
        </body>
        </html>
        

        mit oder ohne provozierte Fehler. MFG

  2. problem gelöst, ich nehm use CGI::Carp qw(fatalsToBrowser set_message); und lass mir die message ausgeben. passt scho ;D

    1. Aha! Also funktionierts ja doch!

      Schau nach der Version und lies Dir mal die Changelog durch zu diesem Modul.

      MFG