gpt4 book ai didi

perl - 使用 mod_cgi 和 mod_perl 捕获错误

转载 作者:行者123 更新时间:2023-12-03 07:42:38 25 4
gpt4 key购买 nike

提前感谢大家。

我一直在做一些关于错误处理的研究,但我觉得我没有完全理解我应该做什么。

序言:我的代码存在于 Apache 中并在浏览器中执行,我的目标不包括命令行执行。

我想拥有 CGI::Carp (fatalsToBrowser) 的行为,能够捕获输出并能够将其扔到我自己的模板页面中,通过电子邮件发送等等......我确实注意到fatalsToBrowser不起作用使用 mod_perl。有谁知道为什么? Apache/mod_perl 是如何阻碍的?

第一个目标:如果代码是用 mod_perl 或 mod_cgi 执行的,我想把一些东西放在一起。

第二个目标:我想要一个高级方法来捕获类似于 .NET 的 Application_Error(在 global.asax 中)和 PHP 的 set_exception_handler() 和 set_error_handler() 方法的所有错误。这些允许您在引发错误时进行控制,而无需将代码包装在困惑/粗略的 try-catch 语句中。

我读过/评论过的东西:

1.) OO Exception Handling in Perl ,但不是我要找的。我想捕捉的大部分东西都是 die()ing。下一个链接还说这篇文章已过时并已弃用。

2.) Perl: $SIG{__DIE__}, eval { } and stack trace ,但我并没有从中得到多少与我的目标相关的东西。

3.) 实用模式 Perl (O'Reilly),第 21 章“错误处理和调试”。值得庆幸的是,我所有的 perl 代码都使用了严格和警告,并且第 6 章“使用 mod_perl 进行编码”中提到的最重要的事情已经完成。

4.) 我翻遍了“Learning Perl”、“Perl Cookbook”、“Programming Perl”和“Higher Order Perl”中的目录,没有看到任何让我印象深刻的东西。如果你认为我错过了什么,请告诉我。 :)

我不记得在哪里(也许在“实用 mod_perl”中,但我读过你不应该混淆 $SIG{__DIE__}。

最佳答案

你想捕捉什么类型的错误?是 custom error pages不足以满足您的目的?

我的 CGI 脚本很短(好吧,这真的很简单——而且未经测试):

#!/usr/bin/perl

use strict;
use warnings;

use My::App;
use My::ErrorReporter qw( error_to_html );

run();

sub run {
my $app = eval {
My::App->new(
'some_param',
'another_param',
)
};

unless ( $app ) {
print error_to_html( $@ );
return;
}

eval {
$app->handle_request;
} and return;

print error_to_html( $@ );
return;
}

__END__

现在, fatalsToBrowser不适合您的用户。这对你来说是一种发展援助。用户看到的错误消息不应传达有关程序的信息。因此,例如,在打开和读取配置文件的例程中,您应该执行以下操作:
sub read_my_config {
my $self = shift;

open my $config_h, '<', $self->config_file;

unless ( $config_h ) {
# This goes to the Apache error log where you can read it
warn sprintf(
"Cannot open '%s': %s",
$self->config_file, $!
);
# This is for web site visitors to see
die "Cannot open configuration file";
}

# rest of the code
}

关于perl - 使用 mod_cgi 和 mod_perl 捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1174463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com