#!/usr/bin/perl use strict; use warnings; use Test::More tests => 8; use Inline 'Ruby'; use Data::Dumper; my @exc = ( [qr{Illegal division by zero}, 'PerlException'], [qr{Missing right (?:curly or square )?bracket}, 'PerlException'], ); # TEST:$n=2; my $n = 0; sub test_exception { my $iter = shift; eval { iter($iter)->callback($n) }; die unless $@; my $x = $@; # Methods: # TEST*$n like ($x->message, $exc[$n][0], "Message for $n"); # print Dumper $x->message; # TEST*$n is ($x->type, $exc[$n][1], "Type for $n"); # print Dumper $x->type; # TEST*$n is ("$x", $x->inspect . "\n", "Stringification for $n"); # Not tested: # print Dumper $x->inspect; # print "Stringified: $x\n"; # print Dumper $x->backtrace; $n++; return; } # Division by zero test_exception( sub { my $x = 0; my $y = 1; my $z; # TODO : This eval + rethrow with die is the only way to get it to # work. But why? eval { $z = $y/$x; }; die $@; }); test_exception( sub { eval "sub bar {"; die $@; }); # Inline::Ruby must clear $@ if there is no exception: iter(sub { 0 })->catch_perlerr; # TEST is ($@, '', "No exception"); # If a Perl exception occurs, but is trapped by a Ruby rescue block, we need # to notice and clean it up. Yay! iter(sub { local $^W; my $x = 0; my $y = 1; return $y/$x; })->catch_perlerr; # print "But... $@\n"; # TEST is ($@, '', "No exception"); __END__ __Ruby__ def callback(t) yield t end def catch_perlerr begin return yield "neil" rescue PerlException => e print "Note: ruby caught an exception. No biggie!\n" return nil end end