Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl $@在eval和Log::Dispatch::Email上的设置不同_Perl_Exception_Eval_Die_Log4perl - Fatal编程技术网

Perl $@在eval和Log::Dispatch::Email上的设置不同

Perl $@在eval和Log::Dispatch::Email上的设置不同,perl,exception,eval,die,log4perl,Perl,Exception,Eval,Die,Log4perl,我在一个应用程序中使用了Log4perl,并创建了自己的appender,它继承了Log::Dispatch::Email,因为我需要对sendmail进行一些特殊处理。这个appender已经工作了几年,但今天我发现了一些奇怪的行为,如果我将Log4perl配置为使用我的appender,或者简单地配置为Log::Dispatch::Email本身,$@就不会像以前那样被设置。我过去常常通过以下方式捕捉错误: eval { main(); 1; }; if (my $error = $@) {

我在一个应用程序中使用了Log4perl,并创建了自己的appender,它继承了Log::Dispatch::Email,因为我需要对sendmail进行一些特殊处理。这个appender已经工作了几年,但今天我发现了一些奇怪的行为,如果我将Log4perl配置为使用我的appender,或者简单地配置为Log::Dispatch::Email本身,$@就不会像以前那样被设置。我过去常常通过以下方式捕捉错误:

eval { main(); 1; };
if (my $error = $@)
{
  log()->error($error);
  exit(error_no_success());
}
exit(error_success());
如果我从Log4perl配置中删除邮件附加器,并且我的应用程序在main中死亡,$error将获取消息,并将其记录在替代文件中。现在的问题是,当我直接配置自己的Log::Dispatch::Email或这个抽象基类的后代时,上面语句中的$@是空字符串,导致与以前相同的错误不再被识别。如果我写一些像eval{}或…$@正确可用,并且可以保存。以下工作:

my $error = undef;
eval { main(); 1; } or $error = $@;
my $error2 = $@;
if ($error)
{
  log()->error($error);
  exit(error_no_success());
}
exit(error_success());
如果以任何方式配置Log::Dispatch::Email,则$error2始终为空字符串。当然,我不想把我所有使用第一个例子的代码都改成第二个

我的第一个例子有什么问题吗?从我的观点来看,它看起来像是在perldoc中为eval记录的,并且它在没有电子邮件附加器的情况下工作

在我的第二个示例中,您能想到为什么使用邮件附加器会改变Perl设置$@的方式、时间或任何内容的行为吗?有解决办法吗?我已经查看了Log::Dispatch的源代码,但没有发现任何明显干扰我的代码的内容

谢谢你的提示

在一些帮助下,我终于发现了问题:$@不可靠。我以前也遇到过类似的问题,并按照约定在所有析构函数中本地化了$@,显然我错过了一个,它用于记录一些调试输出。在任何日志语句之前,在这个析构函数中定位$@之后,我的问题得到了解决,错误捕获再次起作用。我不知道为什么只使用Log::Dispatch触发这个问题,因为析构函数以前总是记录调试语句,但不管怎样。。。就像PerlMonks上建议的那样,将来应该改用Devel::EvalError