The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests => 9;

use Inline Config => DIRECTORY => './blib_test';

use Inline Python => <<END;

import sys

def error():
    raise Exception('Error!')

def empty_error():
    raise Exception()

def name_error():
    return foo

class Foo:
    def error(self):
        raise Exception('Error!')

def thrower():
    return lambda: foo

def catch_perl_exception(failer):
    try:
        failer()
    except Exception:
        exc_type, e, exc_traceback = sys.exc_info()
        return str(e)

def pass_through_perl_exception(failer):
    failer()

END

eval {
    error();
};
ok(1, 'Survived Python exception');
like($@, qr/Error! at line 5/, 'Exception found');

eval {
    empty_error();
};
like($@, qr/Exception:  at line 8/, 'Exception found');

eval {
    name_error();
};
like($@, qr/name 'foo' is not defined at line 11/, 'NameError found');

my $foo = Foo->new;
eval {
    $foo->error;
};
like($@, qr/Exception: Error! at line 15/, 'Exception found');

eval {
    thrower()->();
};
like($@, qr/name 'foo' is not defined at line 18/, 'Exception found');

my $exception = catch_perl_exception(sub { die "fail!"; });
like($exception, qr/fail!/);

eval {
    pass_through_perl_exception(sub { die "fail!"; });
};
like($@, qr/fail!/);

my $foo_exception = bless {}, 'FooException';

eval {
    pass_through_perl_exception(sub { die $foo_exception; });
};
is(ref $@, 'FooException');