perl - 在 Perl 中捕捉信号最优雅的方法是什么?

标签 perl exception signals

我在 Perl 脚本中有 2 行彼此相邻,可能会抛出 __WARN__。如果第一个抛出,那么我只想从函数返回而不是尝试继续。

我知道如何在这两行之前设置一个处理程序,这样我就可以报告错误等:

local $SIG{__WARN__} = sub {
  my $e = shift;
  # log the error etc.
  return;
};
# possibly warning-resulting line 1
# possibly warning-resulting line 2

但是这两条线都会发生这种情况。我宁愿它只是捕获第一个实例并从函数返回。但是该处理程序中的返回仅返回处理程序,而不返回外部函数。

有没有办法在处理信号时从函数返回?

最佳答案

将这两行包装在单独的函数中,并让第一行返回一个状态,指示调用函数应该返回。单独的函数可以根据需要处理警告 - 可能使用相同的函数来执行相同的日志记录。

sub wrap_line_1
{
    local $SIG{__WARN__} = ...;
    ...do line 1...
    return ($warning_fired ? 1 : 0);
}

sub wrap_line_2
{
    local $SIG{__WARN__} = ...;
    ...do line 2...
    return;
}


...calling code...
wrap_line_1() and return;
wrap_line_2();
...

关于perl - 在 Perl 中捕捉信号最优雅的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6160129/

相关文章:

Python with 语句——是否还需要旧式文件处理?

arrays - 在 Perl DBI 中使用数组插入 1 行和很多列

regex - Logwatch ignore.conf 的多行正则表达式

java - 需要帮助来发现java空指针异常

c# - 使用 WCF 数据服务客户端库从 WCF 数据服务查询数据时发现有趣的问题

cocoa - 确定终止的子进程未捕获哪个信号

perl - 一台服务器的 whois TCP 套接字连接失败

bash - 每 X 行 Sed,Y 行之间的 GREP

无法使用在 Solaris 上运行的代码在 Linux 上从 `siginfo_t` 检索 PID

c - 如何通过子进程取消 alarm() 信号?