Home > Archive > PERL Modules > July 2004 > Carp -- shortmess and longmess
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
Carp -- shortmess and longmess
|
|
| Haakon Riiser 2004-07-26, 8:57 am |
| 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?
--
Haakon
| |
| Anno Siegel 2004-07-26, 3:56 pm |
| 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
| |
| Haakon Riiser 2004-07-26, 3:56 pm |
| [Anno Siegel]
> 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:
> [...]
Thanks; in the future, I should probably read beyond the first
paragraph before I consider filing bug reports. I thought the
summary was so clear, that I didn't bother to look to the second
paragraph, which begins: "Here is a more complete description of
how shortmess works." Embarrassing! :-)
--
Haakon
| |
| Abigail 2004-07-26, 8:55 pm |
| Haakon Riiser (hakonrk@fys.uio.no) wrote on MMMCMLXXXII September
MCMXCIII in <URL:news:slrncg9ua0.emo.hakonrk@s.hn.org>:
`' 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.
No, it's not incorrect. You have to read the manual
carefully. longmess/cluck/confess return the stacktrace. Always.
shortmess/carp/croak print the first entry in the stacktrace that isn't
considered "safe". But when everything is "safe", it defaults to printing
the entire stacktrace. The manual also list what is considered safe,
and point 1 says any call into the same package is considered safe.
A small change to your program shows the difference:
#!/usr/bin/perl
use strict;
use warnings;
no warnings qw /syntax/;
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!";
}
package Alien;
sub bar {
main::foo();
}
package main;
Alien::bar();
__END__
This is how we got here! at /tmp/f line 11
main::foo() called at /tmp/f line 19
Alien::bar() called at /tmp/f line 23
This will have caller's details added at /tmp/f line 19
This will have stack backtrace added at /tmp/f line 19
Alien::bar() called at /tmp/f line 23
We're outta here! at /tmp/f line 19
Abigail
--
print v74.117.115.116.32, v97.110.111.116.104.101.114.32,
v80.101.114.108.32, v72.97.99.107.101.114.10;
|
|
|
|
|