7 Einträge, 1 Seite |
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__
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
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
sub ErrorHandler(&) { my $block = shift; my $output = ''; my $warnings = ''; { local *STDOUT; tie *STDOUT, 'Some::Class::Collecting::The::Output', \$output; local $SIG{__WARN__} = sub { local $_ = shift; $warnings .= $_; $warnings .= "\n" unless (/\n$/); }; eval { $block->(); } } if ($@) { # handle the errors } elsif ($warnings) { # handle the warnings } else { print $output; } }
1 2 3 4
my $ErrorHandler = ErrorHandler -> new; $ErrorHandler -> eval { 'der_evtl_fehlerhafte_code' }; print "STDOUT: " . $ErrorHandler -> stdout; print "STDERR: " . $ErrorHandler -> stderr;
syntax error at ./index.cgi line 22, near "->eval {"
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; } }
7 Einträge, 1 Seite |