34exception_action.t [plain text]
use strict;
use warnings;
use Test::More;
use lib qw(t/lib);
use DBICTest;
plan tests => 9;
# 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:
sub throwex { $schema->resultset("Artist")->search(1,1,1); }
my $ex_regex = qr/Odd number of arguments to search/;
# Basic check, normal exception
eval { throwex };
my $e = $@; # like() seems to stringify $@
like($@, $ex_regex);
# Re-throw the exception with rethrow()
eval { $e->rethrow };
isa_ok( $@, 'DBIx::Class::Exception' );
like($@, $ex_regex);
# Now lets rethrow via exception_action
$schema->exception_action(sub { die @_ });
eval { throwex };
like($@, $ex_regex);
# Now lets suppress the error
$schema->exception_action(sub { 1 });
eval { throwex };
ok(!$@, "Suppress exception");
# Now lets fall through and let croak take back over
$schema->exception_action(sub { return });
eval { throwex };
like($@, $ex_regex);
# Whacky useless exception class
{
package DBICTest::Exception;
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(@_) });
eval { throwex };
like($@, qr/DBICTest::Exception is handling this: $ex_regex/);
# While we're at it, lets throw a custom exception through Storage::DBI
eval { $schema->storage->throw_exception('floob') };
like($@, qr/DBICTest::Exception is handling this: floob/);
# This usage is a bit unusual but it was actually seen in the wild
eval {
my $dbh = $schema->storage->dbh;
undef $schema;
$dbh->do ('glaring_syntax_error;');
};
like($@, qr/DBI Exception.+do failed/, 'Exception thrown even after $storage is destroyed');