package SQL::Preproc::Exception;
#
# SQL::Preproc::Exception - runtime exception handler module for SQL::Preproc
#
# Provides a container object for SQL::Preproc context and exception
# handling. When this object goes out of scope, the DESTROY method
# will remove it from the sqlpp_ctxt exception stack
#
use strict;
our $VERSION = '0.10';
sub new {
my ($class, $ctxt, $handler) = @_;
return undef
unless (defined($handler) &&
(ref $handler) &&
(ref $handler eq 'CODE'));
#
# use arrayref to save memory/runtime
#
my $obj = [ $ctxt, $handler ];
bless $obj, $class;
return $obj;
}
sub catch {
my $obj = shift;
#
# make sure that any exceptions thrown within the
# handler are caught by the default handlers
#
my $old_handler = $obj->[0]{handler_idx};
$obj->[0]{handler_idx} = 0;
if (defined($_[1]) && ref $_[1]) {
#
# shortcut: we've got a handle, so grab info from it
#
my $h = $_[1];
$obj->[1]->($_[0], $h->err, $h->state, $h->errstr);
}
else {
$obj->[1]->(@_);
}
$obj->[0]{handler_idx} = $old_handler;
return 1;
}
sub raise {
my $obj = shift;
#
# make sure that any exceptions thrown within the
# handler are caught by the default handlers
#
my $old_handler = $obj->[0]{handler_idx};
$obj->[0]{handler_idx} = 0;
$obj->[1]->(@_);
$obj->[0]{handler_idx} = $old_handler;
return 1;
}
1;