use strict;
use warnings;
-use Carp::Clan qw/^DBIx::Class|^Try::Tiny/;
-use Scalar::Util qw/blessed/;
-use Try::Tiny;
-use namespace::clean;
+# 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__) }++;
+
+use DBIx::Class::Carp ();
use overload
'""' => sub { shift->{msg} },
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.
+and derivatives.
These objects stringify to the contained error message, and use
overload fallback to give natural boolean/numeric values.
This is meant for internal use by L<DBIx::Class>'s C<throw_exception>
code, and shouldn't be used directly elsewhere.
-Expects a scalar exception message. The optional argument
-C<$stacktrace> tells it to use L<Carp/longmess> instead of
-L<Carp::Clan/croak>.
+Expects a scalar exception message. The optional boolean C<$stacktrace>
+causes it to output a full trace similar to L<confess|Carp/DESCRIPTION>.
DBIx::Class::Exception->throw('Foo');
try { ... } catch { DBIx::Class::Exception->throw(shift) }
my ($class, $msg, $stacktrace) = @_;
# Don't re-encapsulate exception objects of any kind
- die $msg if blessed($msg);
+ die $msg if ref($msg);
+
+ # all exceptions include a caller
+ $msg =~ s/\n$//;
- # use Carp::Clan's croak if we're not stack tracing
if(!$stacktrace) {
- try { croak $msg } catch { $msg = shift };
+ # skip all frames that match the original caller, or any of
+ # the dbic-wide classdata patterns
+ my ($ln, $calling) = DBIx::Class::Carp::__find_caller(
+ '^' . caller() . '$',
+ 'DBIx::Class',
+ );
+
+ $msg = "${calling}${msg} ${ln}\n";
}
else {
$msg = Carp::longmess($msg);
die shift;
}
-=head1 AUTHORS
+=head1 AUTHOR AND CONTRIBUTORS
-Brandon L. Black <blblack@gmail.com>
+See L<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
=head1 LICENSE