Another revamp of the selector resolution - now supporting unbalanced select/as
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Exception.pm
index 77a3a96..6c8d0e9 100644 (file)
@@ -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<DBIx::Class::Schema/throw_exception>
+Exception objects of this class are used internally by
+the default error handling of L<DBIx::Class::Schema/throw_exception>
 to prevent confusing and/or redundant re-application of L<Carp>'s
 stack trace information.
 
@@ -42,26 +43,24 @@ C<$stacktrace> tells it to use L<Carp/longmess> instead of
 L<Carp::Clan/croak>.
 
   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;