Skip to content

Commit

Permalink
Handle errors better
Browse files Browse the repository at this point in the history
  • Loading branch information
judofyr committed Feb 29, 2012
1 parent dc5c977 commit 0b29021
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 3 deletions.
11 changes: 8 additions & 3 deletions lib/Mojolicious/Plugin/Parallol.pm
Expand Up @@ -53,8 +53,11 @@ sub register {
# ... we want to run the IO loop and stop it again when it's done.
my $cb = $self->on_parallol;
$self->on_parallol(sub {
$cb->(@_);
# Run the callback; capture any errors.
eval { $cb->(@_); 1 } or my $e = $@;
Mojo::IOLoop->stop;
# Re-throw the error.
die $e if $e;
});

Mojo::IOLoop->start;
Expand Down Expand Up @@ -82,11 +85,13 @@ sub register {


sub {
# Run the callback (and handling errors).
# Run the callback.
eval { $callback->(@_); 1 } or $self->render_exception($@);

# Run on_parallol if it's finished.
$self->on_parallol->($self) if --$p->{paralloling} == 0;
if (--$p->{paralloling} == 0) {
eval { $self->on_parallol->($self); 1 } or $self->render_exception($@);
}
}
}
);
Expand Down
16 changes: 16 additions & 0 deletions t/lib/ParallolController.pm
Expand Up @@ -46,5 +46,21 @@ sub do_instant {
$self->parallol('b')->(1);
}

sub do_error {
my $self = shift;
$self->one($self->parallol(weaken => 0, sub {
die "oh no";
}));
}

sub do_error_done {
my $self = shift;
$self->on_parallol(sub {
die "oh no";
});
$self->one($self->parallol('one'));
}


1;

21 changes: 21 additions & 0 deletions t/parallol.t
Expand Up @@ -58,12 +58,29 @@ get '/instant' => sub {
$self->parallol('b')->(1);
};

get '/error' => sub {
my $self = shift;
$self->one($self->parallol(weaken => 0, sub {
die "oh no";
}));
};

get '/error_done' => sub {
my $self = shift;
$self->on_parallol(sub {
die "oh no";
});
$self->one($self->parallol('one'));
};

my $r = app->routes;

$r->route('/app')->to('ParallolController#do_index');
$r->route('/app/stash')->to('ParallolController#do_stash');
$r->route('/app/nested')->to('ParallolController#do_nested');
$r->route('/app/instant')->to('ParallolController#do_instant');
$r->route('/app/error')->to('ParallolController#do_error');
$r->route('/app/error_done')->to('ParallolController#do_error_done');

my $t = Test::Mojo->new;
my $p = Mojo::Server::PSGI->new;
Expand Down Expand Up @@ -104,12 +121,16 @@ t '/', qr/2/;
t '/stash', qr/11/;
t '/nested', qr/11/;
t '/instant', qr/11/;
t '/error', qr/Server error/, 500;
t '/error_done', qr/Server error/, 500;

# Controller
t '/app', qr/2/;
t '/app/stash', qr/11/;
t '/app/nested', qr/11/;
t '/app/instant', qr/11/;
t '/app/error', qr/Server error/, 500;
t '/app/error_done', qr/Server error/, 500;

done_testing;

Expand Down

0 comments on commit 0b29021

Please sign in to comment.