PApp
view release on metacpan or search on metacpan
PApp/Exception.pm view on Meta::CPAN
##########################################################################
## All portions of this code are copyright (c) 2003,2004 nethype GmbH ##
##########################################################################
## Using, reading, modifying or copying this code requires a LICENSE ##
## from nethype GmbH, Franz-Werfel-Str. 11, 74078 Heilbronn, ##
## Germany. If you happen to have questions, feel free to contact us at ##
## license@nethype.de. ##
##########################################################################
=head1 NAME
PApp::Exception - exception handling for PApp
=head1 SYNOPSIS
use PApp::Exception;
=head1 DESCRIPTION
This module implements a exception class that is able to carry backtrace
information and other information useful for tracking own bugs.
It's the standard exception class used by PApp.
=over 4
=cut
package PApp::Exception;
use base Exporter;
use overload ();
use PApp::HTML;
use utf8;
$VERSION = 2.4;
@EXPORT = qw(fancydie try catch);
no warnings;
# let's try to be careful, but brutale ausnahmefehler just rock!
sub __($) {
eval { &PApp::__ } || $_[0];
}
use overload
'bool' => sub { 1 },
'""' => sub { $_[0]{compatible} || $_[0]->as_string },
fallback => 1,
;
=item local $SIG{__DIE__} = \&PApp::Exception::diehandler
_diehandler is a function suitable to be put into C<$SIG{__DIE__}> (e.g.
inside an eval). The advantage in using this function is that you get a
useful backtrace on an error (among some other information). It should be
compatible with any use of eval but might slow down evals that make heavy
use of exceptions (but these are slow anyway).
Example:
eval {
local $SIG{__DIE__} = \&PApp::Exception::diehandler;
...
};
=cut
sub diehandler {
unless (ref $_[0]) {
# the next few lines are a major stability improvement, as well as a nice speedup
return if $_[0] =~ m%in use at .*XML/Parser/Expat.pm line \d+\.$%;
# better not touch utf8_heavy, since this is called at interesting times....
return if $_[0] =~ m%.*at .*/utf8_heavy.pl line \d+\.$%;
# wether compatible is a good idea here is questionable...
fancydie(__"caught a die", $_[0], compatible => $_[0], skipcallers => 1);
}
}
# internal utility function for Gimp::Fu and others
# talking about code-reuse ^^^^^^^^ ;)
sub wrap_text {
my $x;
for (split /\n/, $_[0]) {
s/\G(.{1,$_[1]})(?:\s+|$)/$1\n/gm;
$x .= $_;
}
$x =~ s/[ \t\015]+$//g;
$x;
}
# called by zero-argument "die"
sub PROPAGATE {
push @{$_[0]{info}}, "propagated at $_[1] line $_[2]";
$_[0];
}
=item $errobj = new PApp::Exception param => value..
Create and return a new exception object. The object is overloaded,
stringification will call C<as_string>.
( run in 1.184 second using v1.01-cache-2.11-cpan-92ad3014f07 )