Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^2: Bug in eval in pre-5.14

by choroba (Cardinal)
on Aug 13, 2016 at 17:59 UTC ( [id://1169717]=note: print w/replies, xml ) Need Help??


in reply to Re: Bug in eval in pre-5.14
in thread Bug in eval in pre-5.14

The point of try/catch is not to stop on the first error (or print it), but to process it and decide to rethrow or continue.

($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

Replies are listed 'Best First'.
Re^3: Bug in eval in pre-5.14
by $h4X4_|=73}{ (Monk) on Aug 13, 2016 at 22:25 UTC

    With a little tweaking of the code it can be done. I was playing around with it so there is more code in Splacker then needed.

    #!/usr/bin/perl use warnings; use strict; BEGIN { # control eval's bypass of die $SIG{__DIE__} = \&Splacker; } my $error_log = ''; print $], "\n"; { package My::Obj; sub new { my $class = shift; bless {@_}, $class } sub DESTROY { my $self = shift; eval { 1 } if ! $self->{finished}; } } my $o1 = 'My::Obj'->new(finished => 1); undef $o1; # Exception Found. eval { my $o2 = 'My::Obj'->new; die "Exception 0!"; }; # And Caught if (Splacker()) { warn 'Caught with Splacker: '.Splacker(); } # Give back die control if you want... $SIG{__DIE__} = \&CORE::die; # Exception overlooked. eval { my $o2 = 'My::Obj'->new; die "Exception 1!"; }; if ($@) { warn "Caught with \$\@: $@"; } # Exception details lost. eval { my $o2 = 'My::Obj'->new; die "Exception 2!"; 1 } or do { warn "Caught with or: $@"; }; # Same as above. use Try::Tiny; try { my $o3 = 'My::Obj'->new; die "Exception 3!"; } catch { warn "Caught with Try::Tiny: $_"; }; sub Splacker { my $error = shift || ''; if ($error eq 'DIE') { print STDERR $error.' '.$error_log; CORE::exit(1); } elsif ($error) { $error_log = $error; # print STDERR $error; } else { return $error_log; } }
    Output:
    Caught with Splacker: Exception 0! at C:\xampp\cgi-bin\Test\tester.pl +line 33. Caught with or: at C:\xampp\cgi-bin\Test\tester.pl line 56. Caught with Try::Tiny: at C:\xampp\cgi-bin\Test\tester.pl line 67. 5.008008

      OK, and now change {1} in the object's destructor to { die 'inside' } - all other cases still catch the Exception #, but Splacker catches the inner one.

      ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

        The output for me made it look like they all bugged out. Notice they all have the same message and line number.eval is hiding a warning from us now with die replacing the number one and this is "just another bug".

        Caught with Splacker: inside at C:\xampp\cgi-bin\Test\index.cgi line 2 +3. Caught with $@: inside at C:\xampp\cgi-bin\Test\index.cgi line 23. Caught with or: inside at C:\xampp\cgi-bin\Test\index.cgi line 23. Caught with Try::Tiny: inside at C:\xampp\cgi-bin\Test\index.cgi line +23. 5.008008
        To catch the hidden error by using the code below, it will work with AND WITHOUT! warnings on...
        "in cleanup" warnings generated from destructor errors are no longer enabled by "use warnings"
        $SIG{ __WARN__} = sub { exit 1 if $_[0] =~ /in cleanup/ };

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1169717]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (7)
As of 2024-03-29 08:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found