Re: Carp -- shortmess and longmess
From: Anno Siegel (anno4000_at_lublin.zrz.tu-berlin.de)
Date: 07/26/04
- Previous message: Jonathan K. Cohen: "Re: bundle up dependent modules"
- In reply to: Haakon Riiser: "Carp -- shortmess and longmess"
- Next in thread: Haakon Riiser: "Re: Carp -- shortmess and longmess"
- Reply: Haakon Riiser: "Re: Carp -- shortmess and longmess"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: 26 Jul 2004 16:19:58 GMT
Haakon Riiser <hakonrk@fys.uio.no> wrote in comp.lang.perl.misc:
> perldoc Carp says:
>
> carp - 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
> shortmess - return the message that carp and croak produce
> longmess - return the message that cluck and confess produce
>
> but this is not how it appears to work. I created a test program
> based on the examples in the manual:
>
> --- begin carp.pl ---
> use Carp qw(croak cluck);
>
> sub foo {
> cluck "This is how we got here!";
> print Carp::shortmess("This will have caller's details added");
> print Carp::longmess("This will have stack backtrace added");
> croak "We're outta here!";
> }
>
> sub bar {
> foo();
> }
>
> bar();
> --- end carp.pl ---
>
> When I run this program, I get the following output:
>
> This is how we got here! at carp.pl line 4
> main::foo() called at carp.pl line 11
> main::bar() called at carp.pl line 14
> This will have caller's details added at carp.pl line 5
> main::foo() called at carp.pl line 11
> main::bar() called at carp.pl line 14
> This will have stack backtrace added at carp.pl line 11
> main::bar() called at carp.pl line 14
> We're outta here! at carp.pl line 7
> main::foo() called at carp.pl line 11
> main::bar() called at carp.pl line 14
>
> The message from cluck seems to be OK -- it prints the backtrace,
> as it should. The next two, shortmess and longmess, appear
> to do the opposite of what they should. shortmess prints the
> longest message, backtrace and everything, while longmess only
> prints the bottom of the stack. It should've been the other
> way around, right? croak also prints the full backtrace, which,
> if I understand the manual correctly, is incorrect.
>
> In summary: carp, cluck, croak and confess all print the full
> backtrace (same as shortmess), and the longmess message is
> never used.
>
> Verified on the following systems:
>
> Custom built Perl 5.8.4 (-Duse64bitint -des), Caro 1.02
> Custom built Perl 5.8.5 (-Duse64bitint -des), Carp 1.03
> Slackware 10's Perl 5.8.4, Carp 1.02
> Red Hat Enterprise Linux WS release 3's Perl 5.8.4, Carp 1.02
>
> Is this a known bug, or should I report it with perlbug?
Carp tries to find a location on the call stack where it believes
the error was introduced. When it can't find one, it switches to
a full backtrace on its own accord. This seems to be happening here.
The error location is always a point where a call crosses module
boundaries. Give it such a call, and the results will be more
consistent:
use Carp;
one();
exit;
sub one { Foo::two() }
package Foo;
sub two {
print Carp::shortmess( 'shortmess');
print Carp::longmess( 'longmess');
}
Anno
- Previous message: Jonathan K. Cohen: "Re: bundle up dependent modules"
- In reply to: Haakon Riiser: "Carp -- shortmess and longmess"
- Next in thread: Haakon Riiser: "Re: Carp -- shortmess and longmess"
- Reply: Haakon Riiser: "Re: Carp -- shortmess and longmess"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Relevant Pages
|