Ask a Question related to PERL Modules, Design and Development.
-
Haakon Riiser #1
Carp -- shortmess and longmess
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
Haakon Riiser Guest
-
ANN: Win32::EventLog::Carp 1.30 released
The latest version of Win32::EventLog::Carp has been uploaded to PAUSE and should begin showing up in a CPAN mirror near you at ... -
No $VERSION for Carp modules
I was documenting the list of modules and module versions that we use in our applications, and noticed that Carp does not have a $VERSION defined.... -
Getting croak or carp into variable ?
Hello List, I am using a module that does use Carp; and you can specify whther you want croak or carp on an error Which is cool. But there is... -
CGI::Carp Problems
Hi all, I'm fairly new to Perl so excuse how stupid i sound. I have this perl script that needs CGI, so Carp.pm gets installed I got the... -
$SIG{__DIE__} doesn't make sense when using CGI::Carp
Me and my cgi-script have the following problem. I'm using the package CGI::Carp (which installs internally some $SIG{__DIE___} handlers). In... -
Anno Siegel #2
Re: Carp -- shortmess and longmess
Haakon Riiser <hakonrk@fys.uio.no> wrote in comp.lang.perl.misc:
Carp tries to find a location on the call stack where it believes> 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?
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
Anno Siegel Guest
-
Haakon Riiser #3
Re: Carp -- shortmess and longmess
[Anno Siegel]
Thanks; in the future, I should probably read beyond the first> 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:
> [...]
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
Haakon Riiser Guest
-
Abigail #4
Re: Carp -- shortmess and longmess
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;
Abigail Guest
-



Reply With Quote


