Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
added new exception template and a few more goodies
  • Loading branch information
kraih committed Dec 11, 2010
1 parent f6b7356 commit 3cd4465
Show file tree
Hide file tree
Showing 13 changed files with 2,924 additions and 141 deletions.
1 change: 1 addition & 0 deletions Changes
@@ -1,6 +1,7 @@
This file documents the revision history for Perl extension Mojolicious.

0.999960 2010-12-01 00:00:00
- Added new exception template and a few more goodies.
- Improved Hypnotoad web server to restart workers regularly.
- Improved documentation.
- Improved query manipulation in Mojo::URL. (yko)
Expand Down
125 changes: 84 additions & 41 deletions lib/Mojo/Exception.pm
Expand Up @@ -8,8 +8,9 @@ use overload 'bool' => sub {1}, fallback => 1;
use overload '""' => sub { shift->to_string }, fallback => 1;

use IO::File;
use Scalar::Util 'blessed';

__PACKAGE__->attr([qw/line lines_before lines_after/] => sub { [] });
__PACKAGE__->attr([qw/line lines_before lines_after trace/] => sub { [] });
__PACKAGE__->attr([qw/message raw_message/] => 'Exception!');
__PACKAGE__->attr(verbose => sub { $ENV{MOJO_EXCEPTION_VERBOSE} || 0 });

Expand All @@ -19,8 +20,9 @@ sub new {
my $self = shift->SUPER::new();

# Message
$self->message(shift);
my $message = $self->message;
my $message = shift;
return $message if blessed $message && $message->isa('Mojo::Exception');
$self->message($message);
$self->raw_message($message);

# Trace name and line
Expand All @@ -44,23 +46,24 @@ sub new {
my @lines = <$handle>;

# Line
$self->_parse_context(\@lines, $line);
$self->_parse_context($line, [\@lines]);

# Done
last;
}
}

# Parse specific file
return $self unless my $lines = shift;
my @lines = split /\n/, $lines;
return $self unless @_;
my @lines;
for my $lines (@_) { push @lines, [split /\n/, $lines] }

# Cleanup plain messages
unless (ref $message) {
my $filter = sub {
my $num = shift;
my $new = "template line $num";
my $line = $lines[$num];
my $line = $lines[0]->[$num];
$new .= qq/, near "$line"/ if defined $line;
$new .= '.';
return $new;
Expand All @@ -74,11 +77,38 @@ sub new {
$line = $1 if $self->message =~ /at\s+template\s+line\s+(\d+)/;

# Context
$self->_parse_context(\@lines, $line) if $line;
$self->_parse_context($line, \@lines) if $line;

return $self;
}

sub throw {
my $self = shift;

# Trace
my @trace;
my $i = 1;
while (my ($p, $f, $l) = caller($i++)) {

# Append
push @trace, [$p, $f, $l];

# Line
if (-r $f) {
next unless my $handle = IO::File->new("< $f");
my @lines = <$handle>;
push @{$trace[-1]}, $lines[$l - 1];
}
}

# Exception
my $e = Mojo::Exception->new(@_);
$e->trace(\@trace);

# Throw
die $e;
}

# You killed zombie Flanders!
# He was a zombie?
sub to_string {
Expand Down Expand Up @@ -110,50 +140,49 @@ sub to_string {
}

sub _parse_context {
my ($self, $lines, $line) = @_;
my ($self, $line, $lines) = @_;

# Wrong file
return unless defined $lines->[$line - 1];
return unless defined $lines->[0]->[$line - 1];

# Context
my $code = $lines->[$line - 1];
chomp $code;
$self->line([$line, $code]);
$self->line([$line]);
for my $l (@$lines) {
my $code = $l->[$line - 1];
chomp $code;
push @{$self->line}, $code;
}

# Cleanup
$self->lines_before([]);
$self->lines_after([]);

# -2
my $previous_line = $line - 3;
$code = $previous_line >= 0 ? $lines->[$previous_line] : undef;
if (defined $code) {
chomp $code;
push @{$self->lines_before}, [$line - 2, $code];
}

# -1
$previous_line = $line - 2;
$code = $previous_line >= 0 ? $lines->[$previous_line] : undef;
if (defined $code) {
chomp $code;
push @{$self->lines_before}, [$line - 1, $code];
}

# +1
my $next_line = $line;
$code = $next_line >= 0 ? $lines->[$next_line] : undef;
if (defined $code) {
chomp $code;
push @{$self->lines_after}, [$line + 1, $code];
# Before
for my $i (2 .. 6) {
my $previous = $line - $i;
last if $previous < 0;
if (defined($lines->[0]->[$previous])) {
unshift @{$self->lines_before}, [$previous + 1];
for my $l (@$lines) {
my $code = $l->[$previous];
chomp $code;
push @{$self->lines_before->[0]}, $code;
}
}
}

# +2
$next_line = $line + 1;
$code = $next_line >= 0 ? $lines->[$next_line] : undef;
if (defined $code) {
chomp $code;
push @{$self->lines_after}, [$line + 2, $code];
# After
for my $i (0 .. 4) {
my $next = $line + $i;
next if $next < 0;
if (defined($lines->[0]->[$next])) {
push @{$self->lines_after}, [$next + 1];
for my $l (@$lines) {
my $code = $l->[$next];
chomp $code;
push @{$self->lines_after->[-1]}, $code;
}
}
}

return $self;
Expand Down Expand Up @@ -214,6 +243,13 @@ Exception message.
Raw unprocessed exception message.
=head2 C<trace>
my $trace = $e->trace;
$e = $e->trace($trace);
Stacktrace.
=head2 C<verbose>
my $verbose = $e->verbose;
Expand All @@ -233,6 +269,13 @@ following new ones.
Construct a new L<Mojo::Exception> object.
=head2 C<throw>
Mojo::Exception->throw('Oops!');
Mojo::Exception->throw('Oops!', $file);
Throw exception with stacktrace.
=head2 C<to_string>
my $string = $e->to_string;
Expand Down
8 changes: 8 additions & 0 deletions lib/Mojo/Template.pm
Expand Up @@ -145,6 +145,10 @@ sub compile {
my $code = $self->code;
return unless $code;

# Stacktrace
local $SIG{__DIE__} =
sub { Mojo::Exception->throw(shift, $self->template, $self->code) };

# Compile
my $compiled = eval $code;

Expand All @@ -170,6 +174,10 @@ sub interpret {
# Shortcut
return unless $compiled;

# Stacktrace
local $SIG{__DIE__} =
sub { Mojo::Exception->throw(shift, $self->template, $self->code) };

# Interpret
my $output = eval { $compiled->(@_) };
$output = Mojo::Exception->new($@, $self->template)->verbose(1) if $@;
Expand Down

0 comments on commit 3cd4465

Please sign in to comment.