Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

use strict;
use lib qw(t/lib);
# Set up the "usual" sqlite for DBICTest
my $schema = DBICTest->init_schema;
# This is how we're generating exceptions in the rest of these tests,
# which might need updating at some future time to be some other
# exception-generating statement:
my $throw = sub { $schema->resultset("Artist")->search(1,1,1) };
my $ex_regex = qr/Odd number of arguments to search/;
# Basic check, normal exception
throws_ok \&$throw, $ex_regex;
my $e = $@;
# Re-throw the exception with rethrow()
throws_ok { $e->rethrow }
$ex_regex;
isa_ok( $@, 'DBIx::Class::Exception' );
# Now lets rethrow via exception_action
$schema->exception_action(sub { die @_ });
throws_ok \&$throw, $ex_regex;
#
# This should have never worked!!!
#
# Now lets suppress the error
$schema->exception_action(sub { 1 });
throws_ok \&$throw,
qr/exception_action handler .+ did \*not\* result in an exception.+original error: $ex_regex/;
# Now lets fall through and let croak take back over
$schema->exception_action(sub { return });
throws_ok {
warnings_are \&$throw,
qr/exception_action handler installed .+ returned false instead throwing an exception/;
} $ex_regex;
# again to see if no warning
throws_ok {
warnings_are \&$throw,
[];
} $ex_regex;
# Whacky useless exception class
{
use overload '""' => \&stringify, fallback => 1;
sub new {
my $class = shift;
bless { msg => shift }, $class;
}
sub throw {
my $self = shift;
die $self if ref $self eq __PACKAGE__;
die $self->new(shift);
}
sub stringify {
"DBICTest::Exception is handling this: " . shift->{msg};
}
}
# Try the exception class
$schema->exception_action(sub { DBICTest::Exception->throw(@_) });
throws_ok \&$throw,
qr/DBICTest::Exception is handling this: $ex_regex/;
# While we're at it, lets throw a custom exception through Storage::DBI
throws_ok { $schema->storage->throw_exception('floob') }
qr/DBICTest::Exception is handling this: floob/;
done_testing;