File Coverage

blib/lib/DBIx/Class/Exception.pm
Criterion Covered Total %
statement 26 27 96.3
branch 3 4 75.0
condition n/a
subroutine 8 8 100.0
pod 2 2 100.0
total 39 41 95.1


line stmt bran cond sub pod time code
1             package DBIx::Class::Exception;
2              
3 380     380   3212 use strict;
  380         1096  
  380         12376  
4 380     380   2049 use warnings;
  380         1024  
  380         12134  
5              
6             # load Carp early to prevent tickling of the ::Internal stash being
7             # interpreted as "Carp is already loaded" by some braindead loader
8 380     380   2411 use Carp ();
  380         1169  
  380         10489  
9             $Carp::Internal{ (__PACKAGE__) }++;
10              
11 380     380   2294 use DBIx::Class::Carp ();
  380         1104  
  380         19270  
12              
13             use overload
14 3599     3599   62256 '""' => sub { shift->{msg} },
15 380     380   2684 fallback => 1;
  380         1116  
  380         5949  
16              
17             =head1 NAME
18              
19             DBIx::Class::Exception - Exception objects for DBIx::Class
20              
21             =head1 DESCRIPTION
22              
23             Exception objects of this class are used internally by
24             the default error handling of L<DBIx::Class::Schema/throw_exception>
25             and derivatives.
26              
27             These objects stringify to the contained error message, and use
28             overload fallback to give natural boolean/numeric values.
29              
30             =head1 METHODS
31              
32             =head2 throw
33              
34             =over 4
35              
36             =item Arguments: $exception_scalar, $stacktrace
37              
38             =back
39              
40             This is meant for internal use by L<DBIx::Class>'s C<throw_exception>
41             code, and shouldn't be used directly elsewhere.
42              
43             Expects a scalar exception message. The optional boolean C<$stacktrace>
44             causes it to output a full trace similar to L<confess|Carp/DESCRIPTION>.
45              
46             DBIx::Class::Exception->throw('Foo');
47             try { ... } catch { DBIx::Class::Exception->throw(shift) }
48              
49             =cut
50              
51             sub throw {
52 3236     3236 1 134020 my ($class, $msg, $stacktrace) = @_;
53              
54             # Don't re-encapsulate exception objects of any kind
55 3236 100       9258 die $msg if ref($msg);
56              
57             # all exceptions include a caller
58 3185         8530 $msg =~ s/\n$//;
59              
60 3185 50       7083 if(!$stacktrace) {
61             # skip all frames that match the original caller, or any of
62             # the dbic-wide classdata patterns
63 3185         12118 my ($ln, $calling) = DBIx::Class::Carp::__find_caller(
64             '^' . caller() . '$',
65             'DBIx::Class',
66             );
67              
68 3185         12782 $msg = "${calling}${msg} ${ln}\n";
69             }
70             else {
71 0         0 $msg = Carp::longmess($msg);
72             }
73              
74 3185         10002 my $self = { msg => $msg };
75 3185         6785 bless $self => $class;
76              
77 3185         30497 die $self;
78             }
79              
80             =head2 rethrow
81              
82             This method provides some syntactic sugar in order to
83             re-throw exceptions.
84              
85             =cut
86              
87             sub rethrow {
88 1     1 1 544 die shift;
89             }
90              
91             =head1 FURTHER QUESTIONS?
92              
93             Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
94              
95             =head1 COPYRIGHT AND LICENSE
96              
97             This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
98             by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
99             redistribute it and/or modify it under the same terms as the
100             L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
101              
102             =cut
103              
104             1;