📄 carp.pm
字号:
package Carp;our $VERSION = '1.08';# this file is an utra-lightweight stub. The first time a function is# called, Carp::Heavy is loaded, and the real short/longmessmess_jmp# subs are installedour $MaxEvalLen = 0;our $Verbose = 0;our $CarpLevel = 0;our $MaxArgLen = 64; # How much of each argument to print. 0 = all.our $MaxArgNums = 8; # How many arguments to print. 0 = all.require Exporter;our @ISA = ('Exporter');our @EXPORT = qw(confess croak carp);our @EXPORT_OK = qw(cluck verbose longmess shortmess);our @EXPORT_FAIL = qw(verbose); # hook to enable verbose mode# if the caller specifies verbose usage ("perl -MCarp=verbose script.pl")# then the following method will be called by the Exporter which knows# to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word# 'verbose'.sub export_fail { shift; $Verbose = shift if $_[0] eq 'verbose'; @_ }# fixed hooks for stashes to point tosub longmess { goto &longmess_jmp }sub shortmess { goto &shortmess_jmp }# these two are replaced when Carp::Heavy is loadedsub longmess_jmp { local($@, $!); eval { require Carp::Heavy }; return $@ if $@; goto &longmess_real;}sub shortmess_jmp { local($@, $!); eval { require Carp::Heavy }; return $@ if $@; goto &shortmess_real;}sub croak { die shortmess @_ }sub confess { die longmess @_ }sub carp { warn shortmess @_ }sub cluck { warn longmess @_ }1;__END__=head1 NAMEcarp - warn of errors (from perspective of caller)cluck - warn of errors with stack backtrace (not exported by default)croak - die of errors (from perspective of caller)confess - die of errors with stack backtrace=head1 SYNOPSIS use Carp; croak "We're outta here!"; use Carp qw(cluck); cluck "This is how we got here!";=head1 DESCRIPTIONThe Carp routines are useful in your own modules becausethey act like die() or warn(), but with a message which is morelikely to be useful to a user of your module. In the case ofcluck, confess, and longmess that context is a summary of everycall in the call-stack. For a shorter message you can use C<carp>or C<croak> which report the error as being from where your modulewas called. There is no guarantee that that is where the errorwas, but it is a good educated guess.You can also alter the way the output and logic of C<Carp> works, bychanging some global variables in the C<Carp> namespace. See thesection on C<GLOBAL VARIABLES> below.Here is a more complete description of how c<carp> and c<croak> work.What they do is search the call-stack for a function call stack wherethey have not been told that there shouldn't be an error. If everycall is marked safe, they give up and give a full stack backtraceinstead. In other words they presume that the first likely lookingpotential suspect is guilty. Their rules for telling whethera call shouldn't generate errors work as follows:=over 4=item 1.Any call from a package to itself is safe.=item 2.Packages claim that there won't be errors on calls to or frompackages explicitly marked as safe by inclusion in C<@CARP_NOT>, or(if that array is empty) C<@ISA>. The ability to override what@ISA says is new in 5.8.=item 3.The trust in item 2 is transitive. If A trusts B, and Btrusts C, then A trusts C. So if you do not override C<@ISA>with C<@CARP_NOT>, then this trust relationship is identical to,"inherits from".=item 4.Any call from an internal Perl module is safe. (Nothing keepsuser modules from marking themselves as internal to Perl, butthis practice is discouraged.)=item 5.Any call to Perl's warning system (eg Carp itself) is safe.(This rule is what keeps it from reporting the error at thepoint where you call C<carp> or C<croak>.)=item 6.C<$Carp::CarpLevel> can be set to skip a fixed number of additionalcall levels. Using this is not recommended because it is verydifficult to get it to behave correctly.=back=head2 Forcing a Stack TraceAs a debugging aid, you can force Carp to treat a croak as a confessand a carp as a cluck across I<all> modules. In other words, force adetailed stack trace to be given. This can be very helpful when tryingto understand why, or from where, a warning or error is being generated.This feature is enabled by 'importing' the non-existent symbol'verbose'. You would typically enable it by saying perl -MCarp=verbose script.plor by including the string C<MCarp=verbose> in the PERL5OPTenvironment variable.Alternately, you can set the global variable C<$Carp::Verbose> to true.See the C<GLOBAL VARIABLES> section below.=head1 GLOBAL VARIABLES=head2 $Carp::MaxEvalLenThis variable determines how many characters of a string-eval are tobe shown in the output. Use a value of C<0> to show all text.Defaults to C<0>.=head2 $Carp::MaxArgLenThis variable determines how many characters of each argument to afunction to print. Use a value of C<0> to show the full length of theargument.Defaults to C<64>.=head2 $Carp::MaxArgNumsThis variable determines how many arguments to each function to show.Use a value of C<0> to show all arguments to a function call.Defaults to C<8>.=head2 $Carp::VerboseThis variable makes C<carp> and C<cluck> generate stack backtracesjust like C<cluck> and C<confess>. This is how C<use Carp 'verbose'>is implemented internally.Defaults to C<0>.=head2 %Carp::InternalThis says what packages are internal to Perl. C<Carp> will neverreport an error as being from a line in a package that is internal toPerl. For example: $Carp::Internal{ __PACKAGE__ }++; # time passes... sub foo { ... or confess("whatever") };would give a full stack backtrace starting from the first calleroutside of __PACKAGE__. (Unless that package was also internal toPerl.)=head2 %Carp::CarpInternalThis says which packages are internal to Perl's warning system. Forgenerating a full stack backtrace this is the same as being internalto Perl, the stack backtrace will not start inside packages that arelisted in C<%Carp::CarpInternal>. But it is slightly different forthe summary message generated by C<carp> or C<croak>. There errorswill not be reported on any lines that are calling packages inC<%Carp::CarpInternal>.For example C<Carp> itself is listed in C<%Carp::CarpInternal>.Therefore the full stack backtrace from C<confess> will not startinside of C<Carp>, and the short message from calling C<croak> isnot placed on the line where C<croak> was called.=head2 $Carp::CarpLevelThis variable determines how many additional call frames are to beskipped that would not otherwise be when reporting where an erroroccurred on a call to one of C<Carp>'s functions. It is fairly easyto count these call frames on calls that generate a full stackbacktrace. However it is much harder to do this accounting for callsthat generate a short message. Usually people skip too many callframes. If they are lucky they skip enough that C<Carp> goes all ofthe way through the call stack, realizes that something is wrong, andthen generates a full stack backtrace. If they are unlucky then theerror is reported from somewhere misleading very high in the callstack.Therefore it is best to avoid C<$Carp::CarpLevel>. Instead useC<@CARP_NOT>, C<%Carp::Internal> and %Carp::CarpInternal>.Defaults to C<0>.=head1 BUGSThe Carp routines don't handle exception objects currently.If called with a first argument that is a reference, they simplycall die() or warn(), as appropriate.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -