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   1921 use strict;
  380         771  
  380         10140  
4 380     380   1513 use warnings;
  380         636  
  380         9140  
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   1506 use Carp ();
  380         727  
  380         9477  
9             $Carp::Internal{ (__PACKAGE__) }++;
10              
11 380     380   1613 use DBIx::Class::Carp ();
  380         670  
  380         16830  
12              
13             use overload
14 3579     3579   57813 '""' => sub { shift->{msg} },
15 380     380   1651 fallback => 1;
  380         730  
  380         4066  
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
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's C
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.
45              
46             DBIx::Class::Exception->throw('Foo');
47             try { ... } catch { DBIx::Class::Exception->throw(shift) }
48              
49             =cut
50              
51             sub throw {
52 3157     3157 1 97671 my ($class, $msg, $stacktrace) = @_;
53              
54             # Don't re-encapsulate exception objects of any kind
55 3157 100       7852 die $msg if ref($msg);
56              
57             # all exceptions include a caller
58 3105         6373 $msg =~ s/\n$//;
59              
60 3105 50       5505 if(!$stacktrace) {
61             # skip all frames that match the original caller, or any of
62             # the dbic-wide classdata patterns
63 3105         10550 my ($ln, $calling) = DBIx::Class::Carp::__find_caller(
64             '^' . caller() . '$',
65             'DBIx::Class',
66             );
67              
68 3105         10250 $msg = "${calling}${msg} ${ln}\n";
69             }
70             else {
71 0         0 $msg = Carp::longmess($msg);
72             }
73              
74 3105         8437 my $self = { msg => $msg };
75 3105         5235 bless $self => $class;
76              
77 3105         29444 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 598 die shift;
89             }
90              
91             =head1 FURTHER QUESTIONS?
92              
93             Check the list of L.
94              
95             =head1 COPYRIGHT AND LICENSE
96              
97             This module is free software L
98             by the L. You can
99             redistribute it and/or modify it under the same terms as the
100             L.
101              
102             =cut
103              
104             1;