【问题标题】:Exit Codes when using die in Perl在 Perl 中使用 die 时的退出代码
【发布时间】:2018-03-16 20:24:54
【问题描述】:

我在 perl 中为我的日志记录框架覆盖了 die,以便它可以记录消息并在控制台上打印。

模具的覆盖代码:

BEGIN{ *CORE::GLOBAL::die = sub { 
        my ($package, $filename, $line, $subroutine) = caller;
        untie *STDERR;
        my $message;
        foreach my $arg (@_) {
            $message = $message.$arg;
        }

        print STDERR $message;
        tie *STDERR, __PACKAGE__, (*STDERR);
        logmessage("die",$message,$filename, $line);
        #What exit code to pass?
        #exit CODE;
    }
}

我不知道在退出进程时设置什么退出代码,因为普通模具退出并带有错误代码。

  • 有什么方法可以找出当 die 时要设置的退出代码 叫什么?

  • 如果能知道可用的错误代码列表也会很有帮助 在 perl 中?

【问题讨论】:

  • 请注意,die() 只是抛出一个异常,稍后可以使用 eval { ... } 捕获该异常。 die() 不应该直接终止程序!
  • 旁注:看看$SIG{__DIE__}是否能满足你的需要。
  • 好的,我会检查的

标签: perl error-handling die


【解决方案1】:

退出代码记录在die:

 exit $! if $!;              # errno
 exit $? >> 8 if $? >> 8;    # child exit status
 exit 255;                   # last resort

但正如@amon 所说,die 不会退出,它会引发异常。与其重写它,不如将整个事情包装到eval { ... ; 1 }(或Try::Tinytry)中,并将异常记录在or docatch 部分中。

【讨论】:

  • 既然 die 被覆盖了,从我的 die 中抛出什么异常?
  • 它以“而不是覆盖”开头,所以没有“我的死”。
  • 问题是我的项目已经有 300 个 perl 文件,我无法将所有这些文件中的每一个都包装起来。所以如果我想将消息记录到我的日志框架中,我需要覆盖它
  • 那么$SIG{__DIE__} 可能更合适。
  • 您可以使用$SIG_{__DIE__}。但是,请将代码放入单个模块并从所有脚本中加载它,而不是将代码插入每个脚本中。
【解决方案2】:

die() 以非零退出代码退出(但我相信它没有定义):

jan@jancooltek ~ $ perl
die("test");
test at - line 1.
jan@jancooltek ~ $ echo $?
9

但是,使用 -e:

jan@jancooltek ~ $ perl -e 'die("test")'
test at -e line 1.
jan@jancooltek ~ $ echo $?
255

exit() 可以使用您喜欢的任何退出代码,Perl 中没有特定规则。 确定一些 != 0 并将其用于这些一般错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2012-01-03
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多