我試圖找出是否有辦法在mod_perl 2下完成響應而不返回主處理程序。到目前爲止,還沒有能夠在文檔中找到該方法。以下是我想要實現的例子: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
下我需要返回原始handler
子例程中的內容。這導致我跟蹤了一連串的電話,他們必須返回一些東西,直到我回到主要的handler
。
例如,而不是:
unless (check_something()) { ...
,我需要做的事情一樣:
my $check = check_something();
return $check if $check;
,我也要做主處理器類似的東西,這是相當ungly一些情況處理。
有沒有辦法在嵌套調用時關閉請求,就像我試圖用我的例子說明的那樣?
編輯:我發現我可以調用一個goto LABEL
和地點,只是在主handler
子程序最後返回之前的標籤。它的工作原理,但仍然感覺像一個骯髒的黑客。我真的希望有更好的方法。
我對mod_perl2不是專家,但通常這看起來像是你會使用例外。在do_post_response()中,使用'die'我們有一個情況......「;並且使用'eval'模塊在handler()中捕獲它,甚至使用'Try :: Tiny'等模塊更好。如果您需要將自定義異常與其他未被捕獲的故障可能發生的異常區分開來,請添加一些'Exception :: Class'。 – mbethke