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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 27;
use Try::Tiny;
try {
my $a = 1+1;
} catch {
fail('Cannot go into catch block because we did not throw an exception')
} finally {
pass('Moved into finally from try');
};
try {
die('Die');
} catch {
ok($_ =~ /Die/, 'Error text as expected');
pass('Into catch block as we died in try');
} finally {
pass('Moved into finally from catch');
};
try {
die('Die');
} finally {
pass('Moved into finally from catch');
} catch {
ok($_ =~ /Die/, 'Error text as expected');
};
try {
die('Die');
} finally {
pass('Moved into finally block when try throws an exception and we have no catch block');
};
try {
die('Die');
} finally {
pass('First finally clause run');
} finally {
pass('Second finally clause run');
};
try {
# do not die
} finally {
if (@_) {
fail("errors reported: @_");
} else {
pass("no error reported") ;
}
};
try {
die("Die\n");
} finally {
is_deeply(\@_, [ "Die\n" ], "finally got passed the exception");
};
try {
try {
die "foo";
}
catch {
die "bar";
}
finally {
pass("finally called");
};
};
$_ = "foo";
try {
is($_, "foo", "not localized in try");
}
catch {
}
finally {
is(scalar(@_), 0, "nothing in \@_ (finally)");
is($_, "foo", "\$_ not localized (finally)");
};
is($_, "foo", "same afterwards");
$_ = "foo";
try {
is($_, "foo", "not localized in try");
die "bar\n";
}
catch {
is($_[0], "bar\n", "error in \@_ (catch)");
is($_, "bar\n", "error in \$_ (catch)");
}
finally {
is(scalar(@_), 1, "error in \@_ (finally)");
is($_[0], "bar\n", "error in \@_ (finally)");
is($_, "foo", "\$_ not localized (finally)");
};
is($_, "foo", "same afterwards");
{
my @warnings;
local $SIG{__WARN__} = sub {
$_[0] =~ /\QExecution of finally() block CODE(0x\E.+\Q) resulted in an exception/
? push @warnings, @_
: warn @_
};
try {
die 'tring'
} finally {
die 'fin 1'
} finally {
pass('fin 2 called')
} finally {
die 'fin 3'
};
is( scalar @warnings, 2, 'warnings from both fatal finally blocks' );
my @originals = sort map { $_ =~ /Original exception text follows:\n\n(.+)/s } @warnings;
like $originals[0], qr/fin 1 at/, 'First warning contains original exception';
like $originals[1], qr/fin 3 at/, 'Second warning contains original exception';
}
1;
|