X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FException.pm;h=a5e9945ec8f885d4ed3b45c5de792511c1a570ea;hb=97940e368df996e1fe6111fb14f560594dc4c0b2;hp=058020298b711567cede6265f0cec31465491e3d;hpb=130c64391b48bae9eb374e931c7d6c308625bf6b;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Exception.pm b/lib/DBIx/Class/Exception.pm index 0580202..a5e9945 100644 --- a/lib/DBIx/Class/Exception.pm +++ b/lib/DBIx/Class/Exception.pm @@ -1,70 +1,103 @@ 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' ); -} +# load Carp early to prevent tickling of the ::Internal stash being +# interpreted as "Carp is already loaded" by some braindead loader +use Carp (); +$Carp::Internal{ (__PACKAGE__) }++; -package DBIx::Class::Exception::Base; +use DBIx::Class::Carp (); -use strict; -use Carp (); +use overload + '""' => sub { shift->{msg} }, + fallback => 1; =head1 NAME -DBIx::Class::Exception - DBIC Exception Class +DBIx::Class::Exception - Exception objects for DBIx::Class -=head1 SYNOPSIS +=head1 DESCRIPTION - DBIx::Class::Exception->throw( qq/Fatal exception/ ); +Exception objects of this class are used internally by +the default error handling of L +and derivatives. -See also L. +These objects stringify to the contained error message, and use +overload fallback to give natural boolean/numeric values. -=head1 DESCRIPTION +=head1 METHODS -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 +=head2 throw -=head1 METHODS +=over 4 -=head2 throw( $message ) +=item Arguments: $exception_scalar, $stacktrace -=head2 throw( message => $message ) +=back -=head2 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 boolean C<$stacktrace> +causes it to output a full trace similar to L. + + DBIx::Class::Exception->throw('Foo'); + try { ... } catch { DBIx::Class::Exception->throw(shift) } =cut sub throw { - my $class = shift; - my %params = @_ == 1 ? ( error => $_[0] ) : @_; + my ($class, $msg, $stacktrace) = @_; + + # Don't re-encapsulate exception objects of any kind + die $msg if ref($msg); + + # all exceptions include a caller + $msg =~ s/\n$//; + + if(!$stacktrace) { + # skip all frames that match the original caller, or any of + # the dbic-wide classdata patterns + my ($ln, $calling) = DBIx::Class::Carp::__find_caller( + '^' . CORE::caller() . '$', + 'DBIx::Class', + ); - my $message = $params{message} || $params{error} || $! || ''; + $msg = "${calling}${msg} ${ln}\n"; + } + else { + $msg = Carp::longmess($msg); + } - local $Carp::CarpLevel = (caller(1) eq 'NEXT' ? 2 : 1); + my $self = { msg => $msg }; + bless $self => $class; - Carp::croak($message); + die $self; } -=head1 AUTHOR +=head2 rethrow -Marcus Ramberg +This method provides some syntactic sugar in order to +re-throw exceptions. + +=cut + +sub rethrow { + die shift; +} -=head1 THANKS +=head1 FURTHER QUESTIONS? -Thanks to the L framework, where this module was borrowed -from. +Check the list of L. -=head1 COPYRIGHT +=head1 COPYRIGHT AND LICENSE -This program is free software, you can redistribute it and/or modify -it under the same terms as Perl itself. +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut