在 fork 子进程中通过 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.
我 try catch 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.
感谢您的帮助!
最佳答案
我很确定这只是一个时间问题。 die
版本稍快一些,因此它有更好的机会在 shell 打印下一个提示之前输出错误消息。当我尝试运行您的示例时,croak
版本通常会在提示之后打印,但有时会在提示之前打印。 die
版本非常一致地出现在提示之前。
关于perl - 如何将 fork 子进程中的 croak 抛出的异常传播到父进程/前台进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947727/