如何将分叉子中croak抛出的异常传播到父/前台进程?

时间:2010-06-01 06:39:59

标签: perl exception-handling 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.

我尝试捕获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.

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我很确定这只是一个时间问题。 die版本稍微快一些,因此在shell打印下一个提示之前,它有更好的机会输出错误消息。当我尝试运行您的示例时,croak版本通常在提示后打印,但偶尔会出现在提示之前。 die版本始终出现在提示之前。