使用Perl中的die命令时的退出代码

3

我已经在Perl中覆盖了die,以便于我的日志框架能够记录消息并在控制台上打印出来。

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方式退出时,我不知道该设置什么退出码。

  • 有没有办法在调用die时找出应该设置什么退出码?

  • 另外,如果能知道Perl中可用的错误代码列表将会很有帮助。


2
请注意,die() 只是抛出一个异常,可以稍后使用 eval { ... } 捕获。die() 不应直接终止程序! - amon
4
附注:另请查看$SIG{__DIE__},看它是否符合您的需求。 - PerlDuck
好的,我会检查一下。 - Dinesh Gowda
2个回答

8
退出代码在die中有详细的记录:
 exit $! if $!;              # errno
 exit $? >> 8 if $? >> 8;    # child exit status
 exit 255;                   # last resort

但是正如@amon所指出的那样,die并不会退出程序,而是会抛出异常。因此,可以将整个代码块包装在eval { ... ; 1 }(或Try::Tinytry)中,并在or docatch部分记录异常。


1
它以“代替覆盖”开始,因此没有“我的die”。 - choroba
1
那么$SIG{__DIE__}可能更合适。 - choroba
300个脚本和大约50个模块。 - Dinesh Gowda
你有我的同情。 - choroba
2
您可以使用$SIG{__DIE__}。但请将代码放入一个单独的模块中,并从所有脚本加载它,而不是将代码插入到每个脚本中。 - choroba
显示剩余4条评论

-1

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 的值,用于这些通用错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接