为什么催化剂在链式作用中只会死一次?

时间:2011-03-02 12:39:39

标签: perl catalyst

请考虑以下行动:

sub get_stuff :Chained('/') :PathPart('stuff') :CaptureArgs(1) {
  my ($self,$c,$stuff_id) = @_;
  die "ARRRRRRGGGG";
}

sub view_stuff :Chained('get_stuff') :PathPart('') :Args(0){
  die "DO'H";
}

现在,如果您要求'/ stuff / 314 /',您将获得

Error: ARRRRG in get_stuff at ...

Error: DO'H in view_stuff at ...

有没有理由不在第一个失败的链路上抛出错误?

为什么催化剂试图继续进行链条?

4 个答案:

答案 0 :(得分:2)

我不确定“为什么”的答案,但我认为这样做是为了提供灵活性。

您应该使用eval(或者最好是Try::TinyTryCatch之类的内容)来捕获错误,如果要停止处理操作,请调用$c->detach

答案 1 :(得分:1)

答案 2 :(得分:1)

所选答案可能已过时。当设置应用程序的配置密钥abort_chain_on_error_fix时,Catalyst可能会提前死亡。

__PACKAGE__->config(abort_chain_on_error_fix => 1);

请参阅有关Catalyst configurations的文档。它还指出,这种行为将来可能是标准的。

答案 3 :(得分:0)

Cucabit是对的,分离是要走的路。至于为什么,通常在perl过程中,'die'会停止这个过程。在Catalyst中你不希望这样。例如,如果您在FastCGI下运行Catalyst应用程序,则会生成一个或多个处理多个请求的独立进程。如果第一个请求会终止进程本身,则Web服务器必须重新生成FastCGI进程,以便能够处理下一个调用。我认为,催化剂捕获'死'(它被用作默认的'do_something()或死$!')并将其变为异常。

我猜你也可以用“退出”来结束这个过程,但你最终会遇到与上面相同的问题,从而导致进程终止。 你当然可以做的是创建自己的'die'方法,记录使用默认日志对象传递的错误,然后调用detach或者其他东西。也应该可以重新定义Catalyst异常处理,因为Catalyst可以做任何事情:)