在分叉子进程中通过croak
抛出异常似乎会在后台进程中打印错误。也就是说,它破坏了shell提示符。
如果我die
而不是croak
,则会将错误消息弹出为前台进程。我试图在没有任何运气的Carp
文档中找出原因。
这就是我的意思。 croak
版本:
$ perl Wrapper.pm
$ error: ... does not exist at Wrapper.pm line 624
die
版本:
$ perl Wrapper.pm
error: ... does not exist at Wrapper.pm line 515.
我尝试捕获fork
并将$@
打印到STDERR并退出,但这没有效果。有任何想法吗?我希望能够在这种特殊情况下使用croak
。
虽然我的代码有点复杂,但以下是重现此行为的方法:
$ perl -MCarp -e 'unless (fork) {croak "child"}'
$ child at -e line 1
<- cursor blinking here. Pressing enter gives me a new prompt:
$
$ perl -e 'unless (fork) {die "child"}'
child at -e line 1.
$
已解决: cjm got it:
$ perl -e '$SIG{__DIE__} = sub {sleep 1}; unless (fork) {die "child"}'
$ child at -e line 1.
感谢您的帮助!
答案 0 :(得分:3)
我很确定这只是一个时间问题。 die
版本稍微快一些,因此在shell打印下一个提示之前,它有更好的机会输出错误消息。当我尝试运行您的示例时,croak
版本通常在提示后打印,但偶尔会出现在提示之前。 die
版本始终出现在提示之前。