Thread code innerhalb von {} (kA ^^) (6 answers)
Opened by keksinat0r at 2008-02-05 20:00

keksinat0r
 2008-02-05 23:23
#105609 #105609
User since
2008-02-05
3 Artikel
BenutzerIn
[default_avatar]
Joa, das kennt man ja schon von eval{} von daher ist das kein Problem ^^

Da ich gereade erfahren hab, dass ich morgen 2 Stunden spaeter aufstehen muss,
hab ich mich eben nochmal an meinen Errorhandler gesetzt...
Jetzt ist mir noch eine Idee gekommen:

Code (perl): (dl )
1
2
3
4
my $ErrorHandler = ErrorHandler -> new;
$ErrorHandler -> eval { 'der_evtl_fehlerhafte_code' };
print "STDOUT: " . $ErrorHandler -> stdout;
print "STDERR: " . $ErrorHandler -> stderr;


Hier wuerde dann STDOUT udn STDERR innerhalb des Handlers entsprechend umgeleitet
und ueber die Methoden stderr und stdout verfuegbar gemacht...
Das waere ziemlich praktisch :)

Leider scheitere ich gerade an der Umsetzung, denn wenn ich es oo-style mache, meckert der Compiler rum:
Code: (dl )
syntax error at ./index.cgi line 22, near "->eval {"


Er will die {} dann nichtmehr...

zZ sieht mein Code folgendermassen aus:
Code (perl): (dl )
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 ErrorHandler (&) {

    my( $STDOUT, $STDERR );

    my $real_STDOUT = *STDOUT;
    my $real_STDERR = *STDERR;

    open( local_STDOUT, '>', \$STDOUT ); *STDOUT = *local_STDOUT;
    open( local_STDERR, '>', \$STDERR ); *STDERR = *local_STDERR;

    eval{ (shift)->() };

    my $error = $@;

    *STDERR = $real_STDERR; close( local_STDERR );
    *STDOUT = $real_STDOUT; close( local_STDOUT );

    push( @ErrorHandler::ErrorBuffer, $STDERR );

    if( $error ){
      die "an error occured!\n";
    }else{
      return $STDOUT;
    }

  }


Hier speichere ich alle Fehlermeldungen (landen ja alle auf STDERR) einfach in einem globalen Array "@ErrorHandler::ErrorBuffer", so kann ich von ueberall darauf zugreiffen.
Wenn ein Fehelr auftritt, wird eine Fehlermeldung ausgegeben, wenn alles gut geht, gibt die Funktion die Ausgabe des Codes zurueck.

Schoener waere hier aber die obere Alternative mit Objekt und Methode.
Kann man das irgendwie umsetzen?

MFG - Keks :)

View full thread code innerhalb von {} (kA ^^)