为什么 Dancer `halt` 命令绕过所有事件?

Why Dancer `halt` command bypass all events?

示例:

hook on_route_exception => sub {
    # This code is not executed  
}

hook on_handler_exception => sub {
    # This code is not executed  
}

hook after => sub {
    # This code is not executed  
}


hook after_error_render => sub {
    # This code is not executed  
}

hook before => sub {
    if ($some_condition) {
        halt("Unauthorized");
        # This code is not executed :
        do_stuff();
    }
};
 
get '/' => sub {
    "hello there";
};

我可以找到 this piece 的文档:

Thus, any code after a halt is ignored, until the end of the route.

但是钩子在路由结束之后,所以不应该被忽略。应该是?

为什么 hooks 也被忽略了?

我认为原因是处理停止了。

halt("Unauthorized");

本质上 return 响应对象中的内容,不需要进一步的事件。停止有效地停止了 request/response.

的所有处理

这是根据其行为方式和描述做出的猜测。

仔细看看:https://metacpan.org/release/BIGPRESH/Dancer-1.3513/source/lib/Dancer.pm#L156

显示在将响应内容设置为“未授权”后,它会调用:

Dancer::Continuation::Halted->new->throw

哪个死了:

https://metacpan.org/release/BIGPRESH/Dancer-1.3513/source/lib/Dancer/Continuation.pm#L14

sub throw { die shift }

至少我是这样读代码的。既然死了就没有别的事可做了。

可能是基于停止意图的故意设计决定。