【问题标题】:$@ gets set differently on eval and Log::Dispatch::Email$@ 在 eval 和 Log::Dispatch::Email 上的设置不同
【发布时间】:2013-08-13 16:07:09
【问题描述】:

我在我的一个应用程序中使用 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 {} or ... $@ 的东西是正确可用的并且可以保存。以下作品:

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 的来源,但找不到任何明显干扰我的代码的东西。

感谢任何提示!

【问题讨论】:

    标签: perl exception eval die log4perl


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2020-01-10
      相关资源
      最近更新 更多