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

keksinat0r
 2008-02-05 20:00
#105599 #105599
User since
2008-02-05
3 Artikel
BenutzerIn
[default_avatar]
hi,

Ich bastel mit gereade einen Errorhandler, der spaeter eine Art Mischung aus CGI::Carp, eval und einem Ausgabepuffer werden soll.

und Zwar wuerde ich gerne soetwas bauen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl5.10.0

use strict;
use warning;

use lib '.';
use ErrorHandler;

ErrorHandler {

#der vermeindlich fehlerhafter Code

}

#weiterer fehlerfreier Code

__END__


Und zwar soll jetzt der Code innerhalb der {} in einem eval{} ausgefuehrt werden.
Desweiteren sollen alle Fehlermeldungen von einer extra Subroutine gehandhabt werden.
Alle Ausgaben (print) sollen nicht nach STDOUT geschickt werden, sondern sollen in einem Puffer landen.
Bei erfolgreichem Ausfuehern des Codes soll die Ausgabe nach STDOUT geschickt werden.
Bei Auftreten eines Fehlers soll der Fehler in eine externe log-Datei geschrieben,
und nach STDOUT eine Fehlermeldung geschickt werden.

Das ist eigentlich auch alles kein Problem:

Code: (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
27
28
29
#!/usr/bin/perl5.10.0

use strict;
use warnings;

sub Fatal {
push( @ErrorHandler::Error, join( '', @_ ) );
last ErrorHandler;
}

sub Warning {
push( @ErrorHandler::Error, join( '', @_ ) );
}

$main::SIG{__DIE__} = \&main::Fatal;
$main::SIG{__WARN__} = \&main::Warning;

ErrorHandler:eval{
#vermeindlich fehlerhafter Code
#alle Ausgaben werden anstatt mit "print" mit einer eigenen
#Subroutine gemacht, die die Ausgabe in $ErrorHandler::Buffer speichert
}

$main::SIG{__DIE__} = \&CORE::die;
$main::SIG{__WARN__} = \&CORE::warn;

# pruefen ob Fehler aufgetreten, wenn ja @ErrorHandler::Error
# in errorlog speichern und Fehlermeldung ausgeben. Wenn nein,
# $ErrorHandler::Buffer ausgeben


Wie man unschwer erkennen kann, ist erstere Loesung uebersichtlicher,
besser verstaendlich und besser zur Erstellung eines entsprechenden Modules geeignet.

Nur mein Problem ist jetzt, wie komme ich an den Code innerhalb von den {}?
Wenn ich es einfach so ausfuehre wie es oben (1. Bsp) steht fuehert er einfach den Code aus...
Ich moechte gern innerhalb der Subroutine "ErrorHandler" auf den Code innerhalb der {} zugreifen.

MFG - Keks :)

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