X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FException.pm;h=34d709e6801bc3cc4a4fa5d40c8cba0bf1349612;hb=57c18b65cf1c7d708efd3717f54fbbc3def07794;hp=40426ad803d730415ef86de47b403db16b6ef91a;hpb=07037f89d4d9bf97c59a2c083de74f669521da47;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Exception.pm b/lib/DBIx/Class/Exception.pm index 40426ad..34d709e 100644 --- a/lib/DBIx/Class/Exception.pm +++ b/lib/DBIx/Class/Exception.pm @@ -1,74 +1,91 @@ package DBIx::Class::Exception; use strict; -use vars qw[@ISA $DBIC_EXCEPTION_CLASS]; -use UNIVERSAL::require; +use warnings; -BEGIN { - push( @ISA, $DBIC_EXCEPTION_CLASS || 'DBIx::Class::Exception::Base' ); -} - -package DBIx::Class::Exception::Base; +use Carp::Clan qw/^DBIx::Class/; +use Scalar::Util qw/blessed/; -use strict; -use Carp (); +use overload + '""' => sub { shift->{msg} }, + fallback => 1; =head1 NAME -DBIx::Class::Exception - DBIC Exception Class - -=head1 SYNOPSIS - - DBIx::Class::Exception->throw( qq/Fatal exception/ ); - -See also L. +DBIx::Class::Exception - Exception objects for DBIx::Class =head1 DESCRIPTION -This is a generic Exception class for DBIx::Class. You can easily -replace this with any mechanism implementing 'throw' by setting -$DBix::Class::Exception::DBIC_EXCEPTION_CLASS +Exception objects of this class are used in internally by +he default error handling of L +to prevent confusing and/or redundant re-application of L's +stack trace information. + +These objects stringify to the contained error message, and use +overload fallback to give natural boolean/numeric values. =head1 METHODS +=head2 throw + =over 4 -=item throw( $message ) +=item Arguments: $exception_scalar, $stacktrace -=item throw( message => $message ) +=back -=item throw( error => $error ) +This is meant for internal use by L's C +code, and shouldn't be used directly elsewhere. -Throws a fatal exception. +Expects a scalar exception message. The optional argument +C<$stacktrace> tells it to use L instead of +L. + + DBIx::Class::Exception->throw('Foo'); + eval { ... }; DBIx::Class::Exception->throw($@) if $@; =cut sub throw { - my $class = shift; - my %params = @_ == 1 ? ( error => $_[0] ) : @_; - - my $message = $params{message} || $params{error} || $! || ''; - - local $Carp::CarpLevel = (caller(1) eq 'NEXT' ? 2 : 1); - - Carp::croak($message); + my ($class, $msg, $stacktrace) = @_; + + # Don't re-encapsulate exception objects of any kind + die $msg if blessed($msg); + + # use Carp::Clan's croak if we're not stack tracing + if(!$stacktrace) { + local $@; + eval { croak $msg }; + $msg = $@ + } + else { + $msg = Carp::longmess($msg); + } + + my $self = { msg => $msg }; + bless $self => $class; + + die $self; } -=back +=head2 rethrow + +This method provides some syntactic sugar in order to +re-throw exceptions. -=head1 AUTHOR +=cut -Marcus Ramberg +sub rethrow { + die shift; +} -=head1 THANKS +=head1 AUTHORS -Thanks to the L framework, where this module was borrowed -from. +Brandon L. Black -=head1 COPYRIGHT +=head1 LICENSE -This program is free software, you can redistribute it and/or modify -it under the same terms as Perl itself. +You may distribute this code under the same terms as Perl itself. =cut