捕获Mod_perl中的特定内部服务器错误

时间:2013-08-08 08:00:42

标签: perl mod-perl

我的perl应用程序目前有基本的日志记录。我正在使用Mod_perl和CGI

当脚本中发生错误时,用户会收到内部服务器错误页面。我知道CPAN CGI有一个错误报告功能,但这个功能似乎适用于单个脚本。我想要的是全局捕获堆栈跟踪,然后在网页上向用户报告。所以,当发生这种情况时,用户会得到一个不错的“出错的”页面,而不是一个无能的内部服务器错误页面。

1 个答案:

答案 0 :(得分:0)

我通过创建bootstrap.pl脚本很好地处理了这个问题。我使用mod_rewrite将所有脚本重定向到bootstrap.pl并将实际url作为参数发布。在bootstrap中我处理会话,日志记录等,最后我调用eval('url'脚本)。最有趣的是错误处理:

use ex::override GLOBAL_die => sub {
    my $stackTrace = Devel::StackTrace->new(no_refs => 1)->as_string;
    if ($stackTrace =~ /eval \{/) {
            CORE::die @_;
    } else {
            local *__ANON__ = "Exception";
            select STDOUT;
            print getError500( sprintf(
                                    join("\n",<DATA>),
                                    @_,
                                    $stackTrace,
                                    Dumper(\%ENV)
            ));
            CORE::exit 1;
    }

};

这是覆盖模具并在异常时打印漂亮的错误500页。我尝试了很多东西,这对我来说似乎是最好的方法。