Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/Exceptions.pm view on Meta::CPAN
}
sub rethrow_exception
{
my $err = shift;
return unless $err;
if ( Alzabo::Utils::safe_can( $err, 'rethrow' ) )
{
$err->rethrow;
}
elsif ( ref $err )
{
die $err;
}
Alzabo::Exception->throw( error => $err );
}
package Alzabo::Exception;
sub format
{
my $self = shift;
if (@_)
{
$self->{format} = shift eq 'html' ? 'html' : 'text';
}
return $self->{format} || 'text';
}
sub as_string
{
my $self = shift;
my $stringify_function = "as_" . $self->format;
return $self->$stringify_function();
}
sub as_text
{
return $_[0]->full_message . "\n\n" . $_[0]->trace->as_string;
}
sub as_html
{
my $self = shift;
my $msg = $self->full_message;
require HTML::Entities;
$msg = HTML::Entities::encode_entities($msg);
$msg =~ s/\n/<br>/;
my $html = <<"EOF";
<html><body>
<p align="center"><font face="Verdana, Arial, Helvetica, sans-serif"><b>System error</b></font></p>
<table border="0" cellspacing="0" cellpadding="1">
<tr>
<td nowrap align="left" valign="top"><b>error:</b> </td>
<td align="left" valign="top" nowrap>$msg</td>
</tr>
<tr>
<td align="left" valign="top" nowrap><b>code stack:</b> </td>
<td align="left" valign="top" nowrap>
EOF
foreach my $frame ( $self->trace->frames )
{
my $filename = HTML::Entities::encode_entities( $frame->filename );
my $line = $frame->line;
$html .= "$filename: $line<br>\n";
}
$html .= <<'EOF';
</td>
</tr>
</table>
</body></html>
EOF
return $html;
}
package Alzabo::Exception::Driver;
sub full_message
{
my $self = shift;
my $msg = $self->error;
$msg .= "\nSQL: " . $self->sql if $self->sql;
if ( $self->bind )
{
my @bind = map { defined $_ ? $_ : '<undef>' } @{ $self->bind };
$msg .= "\nBIND: @bind" if @bind;
}
return $msg;
}
1;
=head1 NAME
Alzabo::Exceptions - Creates all exception subclasses used in Alzabo.
=head1 SYNOPSIS
use Alzabo::Exceptions;
=head1 DESCRIPTION
Using this class creates all the exceptions classes used by Alzabo
( run in 1.400 second using v1.01-cache-2.11-cpan-97f6503c9c8 )