X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FException.pm;h=6c8d0e9a69e599a01a9664c11a0fc593aa7c010b;hb=da0dd7dc8c18f051d39733703d3790af65c9842e;hp=77a3a967dd8a18c4ec0758e541cf30a2ebd3da44;hpb=b2f408f3651f1f86865e4f850858fe73ad18a084;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Exception.pm b/lib/DBIx/Class/Exception.pm index 77a3a96..6c8d0e9 100644 --- a/lib/DBIx/Class/Exception.pm +++ b/lib/DBIx/Class/Exception.pm @@ -3,8 +3,9 @@ package DBIx::Class::Exception; use strict; use warnings; -use Carp::Clan qw/^DBIx::Class/; -use Scalar::Util qw/blessed/; +use Carp::Clan qw/^DBIx::Class|^Try::Tiny/; +use Try::Tiny; +use namespace::clean; use overload '""' => sub { shift->{msg} }, @@ -16,8 +17,8 @@ DBIx::Class::Exception - Exception objects for DBIx::Class =head1 DESCRIPTION -Exception objects of this class are used in internally by -he default error handling of L +Exception objects of this class are used internally by +the default error handling of L to prevent confusing and/or redundant re-application of L's stack trace information. @@ -42,26 +43,24 @@ C<$stacktrace> tells it to use L instead of L. DBIx::Class::Exception->throw('Foo'); - eval { ... }; DBIx::Class::Exception->throw($@) if $@; + try { ... } catch { DBIx::Class::Exception->throw(shift) } =cut sub throw { my ($class, $msg, $stacktrace) = @_; - # Don't re-encapsulate multiple times - die $msg if blessed($msg) && $msg->isa('DBIx::Class::Exception'); + # Don't re-encapsulate exception objects of any kind + die $msg if ref($msg); # use Carp::Clan's croak if we're not stack tracing if(!$stacktrace) { - local $@; - eval { croak $msg }; - $msg = $@ + try { croak $msg } catch { $msg = shift }; } else { $msg = Carp::longmess($msg); } - + my $self = { msg => $msg }; bless $self => $class;