[Catalyst] [again] die() in an action chain : does not break the
chain !
Ashley
apv at sedition.com
Fri Mar 14 15:32:33 GMT 2008
I've been threatening for more than a year to write a plugin to do this.
I wrote to ask for CPAN/method name suggestions, Aristotle gave me
good advice
which I'll have to dig up.
If you want to do it yourself you would just put a new method which dies
and detaches. Then in your examples below you'd call
$c->error_out() (I think this is my original stupid name which Aristotle
tried to save us all from) and it would throw your exception (or perhaps
something out of $c->errors) and $c->detach("end")... maybe. It's been
a year since I looked at it though I think it's a good idea.
-Ashley
On Mar 14, 2008, at 12:54 AM, Dami Laurent (PJ) wrote:
> Hello list,
>
> Sorry, I already asked the same question a couple of days ago, but
> probably I was not clear enough.
>
> My problem is that if there is an exception at the entry point of an
> action chain, processing nevertheless continues until the endpoint of
> the chain.
>
> Consider for example the following action chain :
>
> sub one : Chained("/") :PathPart("one") :CaptureArgs(0) {
> my ($self, $c) = @_;
> $c->{stash}{msg} = "start_work";
> die "die in one";
> }
>
> sub two : Chained("one") :PathPart("two") :CaptureArgs(0) {
> my ($self, $c) = @_;
> $c->{stash}{msg} .= ", ". $self->expensive_work($c);
> die "die in two";
> }
>
> sub three : Chained("two") :PathPart("three") :Args(0) {
> my ($self, $c) = @_;
> $c->{stash}{msg} .= ", ". $self->expensive_work($c) . " again";
> die "die in three";
> $c->response->body($c->stash->{msg});
> }
>
> sub expensive_work {
> my ($self, $c) = @_;
> return "this took me a long time";
> }
>
> and the following finalize_error function :
>
> sub finalize_error {
> my ($c) = @_;
> my $body = "got errors : " . join ("\n", @{$c->error})
> . "\nand message was :\n" . $c->stash->{msg};
> $c->response->body($body);
> }
>
> This yields
>
> got errors : Caught exception in
> Cata_exceptions::Controller::Root->one "die in one at
> D:/Temp/Cata_exceptions/scripts/../lib/Cata_exceptions/Controller/
> Root.p
> m line 22."
> Caught exception in Cata_exceptions::Controller::Root->two "die
> in two
> at
> D:/Temp/Cata_exceptions/scripts/../lib/Cata_exceptions/Controller/
> Root.p
> m line 28."
> Caught exception in Cata_exceptions::Controller::Root->three "die in
> three at
> D:/Temp/Cata_exceptions/scripts/../lib/Cata_exceptions/Controller/
> Root.p
> m line 35."
> and message was :
> start_work, this took me a long time, this took me a long time again
>
>
> Now the question is : how to avoid calling expensive_work() ? Is
> there a
> way to tune up the chaining mechanism so that it would automatically
> detach() at the first exception ?
>
> Thanks in advance, Laurent Dami
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/
> catalyst at lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/
More information about the Catalyst
mailing list