ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/Carp.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:08 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 package Carp;
2    
3     our $VERSION = '1.04';
4    
5     =head1 NAME
6    
7     carp - warn of errors (from perspective of caller)
8    
9     cluck - warn of errors with stack backtrace
10     (not exported by default)
11    
12     croak - die of errors (from perspective of caller)
13    
14     confess - die of errors with stack backtrace
15    
16     shortmess - return the message that carp and croak produce
17    
18     longmess - return the message that cluck and confess produce
19    
20     =head1 SYNOPSIS
21    
22     use Carp;
23     croak "We're outta here!";
24    
25     use Carp qw(cluck);
26     cluck "This is how we got here!";
27    
28     print FH Carp::shortmess("This will have caller's details added");
29     print FH Carp::longmess("This will have stack backtrace added");
30    
31     =head1 DESCRIPTION
32    
33     The Carp routines are useful in your own modules because
34     they act like die() or warn(), but with a message which is more
35     likely to be useful to a user of your module. In the case of
36     cluck, confess, and longmess that context is a summary of every
37     call in the call-stack. For a shorter message you can use carp,
38     croak or shortmess which report the error as being from where
39     your module was called. There is no guarantee that that is where
40     the error was, but it is a good educated guess.
41    
42     You can also alter the way the output and logic of C<Carp> works, by
43     changing some global variables in the C<Carp> namespace. See the
44     section on C<GLOBAL VARIABLES> below.
45    
46     Here is a more complete description of how shortmess works. What
47     it does is search the call-stack for a function call stack where
48     it hasn't been told that there shouldn't be an error. If every
49     call is marked safe, it then gives up and gives a full stack
50     backtrace instead. In other words it presumes that the first likely
51     looking potential suspect is guilty. Its rules for telling whether
52     a call shouldn't generate errors work as follows:
53    
54     =over 4
55    
56     =item 1.
57    
58     Any call from a package to itself is safe.
59    
60     =item 2.
61    
62     Packages claim that there won't be errors on calls to or from
63     packages explicitly marked as safe by inclusion in @CARP_NOT, or
64     (if that array is empty) @ISA. The ability to override what
65     @ISA says is new in 5.8.
66    
67     =item 3.
68    
69     The trust in item 2 is transitive. If A trusts B, and B
70     trusts C, then A trusts C. So if you do not override @ISA
71     with @CARP_NOT, then this trust relationship is identical to,
72     "inherits from".
73    
74     =item 4.
75    
76     Any call from an internal Perl module is safe. (Nothing keeps
77     user modules from marking themselves as internal to Perl, but
78     this practice is discouraged.)
79    
80     =item 5.
81    
82     Any call to Carp is safe. (This rule is what keeps it from
83     reporting the error where you call carp/croak/shortmess.)
84    
85     =back
86    
87     =head2 Forcing a Stack Trace
88    
89     As a debugging aid, you can force Carp to treat a croak as a confess
90     and a carp as a cluck across I<all> modules. In other words, force a
91     detailed stack trace to be given. This can be very helpful when trying
92     to understand why, or from where, a warning or error is being generated.
93    
94     This feature is enabled by 'importing' the non-existent symbol
95     'verbose'. You would typically enable it by saying
96    
97     perl -MCarp=verbose script.pl
98    
99     or by including the string C<MCarp=verbose> in the PERL5OPT
100     environment variable.
101    
102     Alternately, you can set the global variable C<$Carp::Verbose> to true.
103     See the C<GLOBAL VARIABLES> section below.
104    
105     =cut
106    
107     # This package is heavily used. Be small. Be fast. Be good.
108    
109     # Comments added by Andy Wardley <abw@kfs.org> 09-Apr-98, based on an
110     # _almost_ complete understanding of the package. Corrections and
111     # comments are welcome.
112    
113     # The members of %Internal are packages that are internal to perl.
114     # Carp will not report errors from within these packages if it
115     # can. The members of %CarpInternal are internal to Perl's warning
116     # system. Carp will not report errors from within these packages
117     # either, and will not report calls *to* these packages for carp and
118     # croak. They replace $CarpLevel, which is deprecated. The
119     # $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval
120     # text and function arguments should be formatted when printed.
121    
122     # Comments added by Jos I. Boumans <kane@dwim.org> 11-Aug-2004
123     # I can not get %CarpInternal or %Internal to work as advertised,
124     # therefor leaving it out of the below documentation.
125     # $CarpLevel may be decprecated according to the last comment, but
126     # after 6 years, it's still around and in heavy use ;)
127    
128     =pod
129    
130     =head1 GLOBAL VARIABLES
131    
132     =head2 $Carp::CarpLevel
133    
134     This variable determines how many call frames are to be skipped when
135     reporting where an error occurred on a call to one of C<Carp>'s
136     functions. For example:
137    
138     $Carp::CarpLevel = 1;
139     sub bar { .... or _error('Wrong input') }
140     sub _error { Carp::carp(@_) }
141    
142     This would make Carp report the error as coming from C<bar>'s caller,
143     rather than from C<_error>'s caller, as it normally would.
144    
145     Defaults to C<0>.
146    
147     =head2 $Carp::MaxEvalLen
148    
149     This variable determines how many characters of a string-eval are to
150     be shown in the output. Use a value of C<0> to show all text.
151    
152     Defaults to C<0>.
153    
154     =head2 $Carp::MaxArgLen
155    
156     This variable determines how many characters of each argument to a
157     function to print. Use a value of C<0> to show the full length of the
158     argument.
159    
160     Defaults to C<64>.
161    
162     =head2 $Carp::MaxArgNums
163    
164     This variable determines how many arguments to each function to show.
165     Use a value of C<0> to show all arguments to a function call.
166    
167     Defaults to C<8>.
168    
169     =head2 $Carp::Verbose
170    
171     This variable makes C<Carp> use the C<longmess> function at all times.
172     This effectively means that all calls to C<carp> become C<cluck> and
173     all calls to C<croak> become C<confess>.
174    
175     Note, this is analogous to using C<use Carp 'verbose'>.
176    
177     Defaults to C<0>.
178    
179     =cut
180    
181    
182     $CarpInternal{Carp}++;
183     $CarpInternal{warnings}++;
184     $CarpLevel = 0; # How many extra package levels to skip on carp.
185     # How many calls to skip on confess.
186     # Reconciling these notions is hard, use
187     # %Internal and %CarpInternal instead.
188     $MaxEvalLen = 0; # How much eval '...text...' to show. 0 = all.
189     $MaxArgLen = 64; # How much of each argument to print. 0 = all.
190     $MaxArgNums = 8; # How many arguments to print. 0 = all.
191     $Verbose = 0; # If true then make shortmess call longmess instead
192    
193     require Exporter;
194     @ISA = ('Exporter');
195     @EXPORT = qw(confess croak carp);
196     @EXPORT_OK = qw(cluck verbose longmess shortmess);
197     @EXPORT_FAIL = qw(verbose); # hook to enable verbose mode
198    
199     =head1 BUGS
200    
201     The Carp routines don't handle exception objects currently.
202     If called with a first argument that is a reference, they simply
203     call die() or warn(), as appropriate.
204    
205     =cut
206    
207     # if the caller specifies verbose usage ("perl -MCarp=verbose script.pl")
208     # then the following method will be called by the Exporter which knows
209     # to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word
210     # 'verbose'.
211    
212     sub export_fail {
213     shift;
214     $Verbose = shift if $_[0] eq 'verbose';
215     return @_;
216     }
217    
218    
219     # longmess() crawls all the way up the stack reporting on all the function
220     # calls made. The error string, $error, is originally constructed from the
221     # arguments passed into longmess() via confess(), cluck() or shortmess().
222     # This gets appended with the stack trace messages which are generated for
223     # each function call on the stack.
224    
225     sub longmess {
226     {
227     local($@, $!);
228     # XXX fix require to not clear $@ or $!?
229     # don't use require unless we need to (for Safe compartments)
230     require Carp::Heavy unless $INC{"Carp/Heavy.pm"};
231     }
232     # Icky backwards compatibility wrapper. :-(
233     my $call_pack = caller();
234     if ($Internal{$call_pack} or $CarpInternal{$call_pack}) {
235     return longmess_heavy(@_);
236     }
237     else {
238     local $CarpLevel = $CarpLevel + 1;
239     return longmess_heavy(@_);
240     }
241     }
242    
243    
244     # shortmess() is called by carp() and croak() to skip all the way up to
245     # the top-level caller's package and report the error from there. confess()
246     # and cluck() generate a full stack trace so they call longmess() to
247     # generate that. In verbose mode shortmess() calls longmess() so
248     # you always get a stack trace
249    
250     sub shortmess { # Short-circuit &longmess if called via multiple packages
251     {
252     local($@, $!);
253     # XXX fix require to not clear $@ or $!?
254     # don't use require unless we need to (for Safe compartments)
255     require Carp::Heavy unless $INC{"Carp/Heavy.pm"};
256     }
257     # Icky backwards compatibility wrapper. :-(
258     my $call_pack = caller();
259     local @CARP_NOT = caller();
260     shortmess_heavy(@_);
261     }
262    
263    
264     # the following four functions call longmess() or shortmess() depending on
265     # whether they should generate a full stack trace (confess() and cluck())
266     # or simply report the caller's package (croak() and carp()), respectively.
267     # confess() and croak() die, carp() and cluck() warn.
268    
269     sub croak { die shortmess @_ }
270     sub confess { die longmess @_ }
271     sub carp { warn shortmess @_ }
272     sub cluck { warn longmess @_ }
273    
274     1;