Perl 为什么catalyst在一个连锁反应中不会死一次?

Perl 为什么catalyst在一个连锁反应中不会死一次?,perl,catalyst,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

考虑以下行动:

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 ...
为什么不在第一个失败的链环上抛出错误呢


为什么catalyst要继续这个链条?

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


如果您想停止处理操作,您可能应该通过eval或类似或的方式捕获错误,并调用$c->detach。

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


如果您想停止处理操作,您可能应该使用eval或类似于或的方法捕获错误,并调用$c->detach。

Cucabit是正确的,detach是一种方法。至于为什么,通常在perl进程中,“die”会停止进程。在Catalyst中,你不想这样。例如,如果您在FastCGI下运行Catalyst应用程序,则会生成一个或多个独立进程来处理多个请求。如果第一个请求将杀死进程本身,web服务器将不得不重新启动FastCGI进程,以便能够处理下一个调用。为此,Catalyst捕捉到了“die”,它经常被用作默认的“do_something or die$!”把它变成一个例外

我想,您也可以使用“退出”来结束流程,但您最终会遇到与上面相同的问题,终止流程。
当然,您可以创建自己的“die”方法,该方法记录通过默认日志对象传递的错误,然后调用detach或其他方法。还可以重新定义Catalyst异常处理,因为Catalyst可以做任何事情:

Cucabit是正确的,分离是正确的方法。至于为什么,通常在perl进程中,“die”会停止进程。在Catalyst中,你不想这样。例如,如果您在FastCGI下运行Catalyst应用程序,则会生成一个或多个独立进程来处理多个请求。如果第一个请求将杀死进程本身,web服务器将不得不重新启动FastCGI进程,以便能够处理下一个调用。为此,Catalyst捕捉到了“die”,它经常被用作默认的“do_something or die$!”把它变成一个例外

我想,您也可以使用“退出”来结束流程,但您最终会遇到与上面相同的问题,终止流程。
当然,您可以创建自己的“die”方法,该方法记录通过默认日志对象传递的错误,然后调用detach或其他方法。还可以重新定义Catalyst异常处理,因为Catalyst可以做任何事情:

选择的答案可能已经过时。当设置应用程序的配置键abort\u chain\u on\u error\u fix时,Catalyst可能会过早死亡


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

选择的答案可能已经过时。当设置应用程序的配置键abort\u chain\u on\u error\u fix时,Catalyst可能会过早死亡


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

催化剂有很多层可能会被压死。继续评估连锁反应显然是一种选择。催化剂有很多层有机会捕捉到死亡。继续评估链接操作显然是一种选择。欢迎继续。也许你应该从你提供的链接中添加一些解释,如果链接中断,你的答案将是无用的。你甚至可以在答案中复制粘贴正确的信息。可以使用“编辑”添加更多信息。请看常见问题解答:欢迎加入。也许你应该从你提供的链接中添加一些解释,如果链接中断,你的答案将是无用的。你甚至可以在答案中复制粘贴正确的信息。可以使用“编辑”添加更多信息。请参阅常见问题解答:
__PACKAGE__->config(abort_chain_on_error_fix => 1);