2011-07-19T19:05:47 markyAh eine Frage habe ich noch ich habe 2 "exits" wie kann ich das unter FCGI machen, dh. das Script an der Stelle verlassen, ohne den Prozess zu beenden?
1 2 3 4 5 6 7 8
_init(); while ( $query = new CGI::Fast ) { last unless ( _dispatch() ); last if ( -M $ENV{'SCRIPT_FILENAME'} < 0 ); $run_count++; last if ( $run_count > $max_runs ); } _exit();
1 2 3 4 5 6 7 8 9 10 11 12
while(my $c=CGI::Fast->new()) { # ... Viel alter Code # irgendwo #exit(); goto ENDE; # ... Viel alter Code ENDE: }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
method run_fcgi { # validate if fast cgi is available try { use CGI::Fast; use FCGI; } catch { print CGI::header; print CGI::div(q{ sorry, fastcgi is not available on this server. (missing CGI::Fast or FCGI - could not be loaded) fix this or run as cgi }); exit; }; # setup disptacher my $disp = $self->_get_dispatcher; $disp->setup; # fcgi loop $ENV{'_persistent'} = 1; while (my $cgi = new CGI::Fast) { $ENV{'_start_time'} = Benchmark->new; # reset timer $ENV{'_persistent'}++; $disp->route($cgi); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
sub main { use Try::Tiny; use CGI; print CGI::header; try { use Foo; Foo->new->dosomething; print "erfolgreich"; } catch { print "fehler: ", $_; } } package Foo; # ... sub dosomething { # ... die "ooops!"; }
2011-07-20T15:20:34 markyHallo,
danke für den umfangreichen Beitrag, das Error-Modul habe ich mir schon länger angeschaut, dass das komplett mit eval gemacht "gefällt" mir nicht, ich möchte nicht meine 10.000sende Zeile per eval verarbeiten.
2011-07-20T17:22:40 rooootPython z.B. bietet ja richtig schönes ExceptionHandling an. Liegt wohl einfach in der Natur der Sprache, dass alles ein Object ist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#/usr/bin/perl use strict; use warnings; sub trace { my @lst; my $deep=2; while(my ($package, $filename, $line, $subroutine)=caller($deep++)) { push @lst, "at $filename, Line $line (Package:$package, Sub:$subroutine)\n"; } print STDERR "\n\n",reverse(@lst); print @_ if(@_); } $SIG{__DIE__} = sub{ trace() }; $SIG{__WARN__} = sub{ trace(@_) }; a(); ######################################################################## sub a{ b() } sub b{ c() } sub c{ IN::d() } package IN; sub d{ e() } sub e { warn("UPS"); f(); } sub f{ IN::IN::g() } package IN::IN; sub g{ h() } sub h{ die("BOOM") }
2011-07-21T10:13:25 rooootDu musst "Block-eval" (eval{ ... }) von "String-eval" (eval('...')) unterscheiden das erste verhält sich wie "try" in anderen Sprachen. Es wird keine Interpreterinstanz gestartet. Nur "die" wird dort abgefangen, was einem "throw" entspricht.Ich habe mal etwas Zeit mit ExceptionHandling in Perl verbracht, cpan durchsucht.
Welche try-catch Lösung verwendet denn nicht eval?
2011-07-21T10:13:25 rooootDas war auch nur als Demonstration gedacht. Ich schrieb ja dass es bessere Module dafür gibt.Deine Lösung ist natürlich trotzdem nett. Devel::StackTrace gibt allerdings etwas ähnliches aus
2011-07-21T10:13:25 rooootWelche try-catch Lösung verwendet denn nicht eval?