【发布时间】:2017-01-06 00:44:38
【问题描述】:
我正在尝试找出是否有办法在 mod_perl 2 下完成响应而不返回主处理程序。到目前为止,还没有在文档中找到一种方法。以下是我想要实现的示例:
#!/usr/bin/perl
# This is some mod_perl handler
use strict;
use warnings;
use Apache2::Const ':common';
sub handler {
my $r = shift;
if ($r->method eq 'POST') {
# just to do something as example
do_post_response($r);
}
$r->content_type('text/plain');
print "Thank you, goodbye.";
return Apache2::Const::OK;
}
sub do_post_response {
my $r = shift;
unless (check_somthing()) {
# Suppose I find a situation that requires
# a different response than normal...
$r->content_type('text/plain');
print "We have a situation...";
$r->something_to_finish_the_request_immediatly(Apache2::Const::OK);
}
}
在常规的 Perl 脚本中,作为独立运行或在 mod_cgi 下运行,我可以只使用新响应 exit(),但在 mod_perl 下,我需要在原始 handlersubroutine 中返回一些内容。这导致我跟踪整个调用链,所有调用链都必须返回一些东西,直到我回到主要的handler。
例如,而不是:
unless (check_something()) { ...
我需要做以下事情:
my $check = check_something();
return $check if $check;
而且我还必须在主处理程序中做类似的事情,这对于某些情况处理来说是相当难看的。
有没有办法在嵌套调用中关闭请求,就像我试图用我的示例说明的那样?
编辑:我发现我可以调用 goto LABEL 并将该标签放置在主 handlersubroutine 中的最后一个返回之前。它有效,但仍然感觉像一个肮脏的黑客。我真的希望有更好的方法。
【问题讨论】:
-
我不是 mod_perl2 方面的专家,但通常这看起来像是你会使用例外的东西。在 do_post_response() 中,使用
die "We have a situation...";并在 handler() 中使用eval块或更好地使用像Try::Tiny这样的模块来捕获它。添加一些Exception::Class如果您需要将您的自定义异常与其他未捕获的故障可能导致的异常区分开来。
标签: apache perl mod-perl mod-perl2