Как я могу распространить исключение, выброшенное карканье в разветвленном потомке, на родительский / основной процесс? - PullRequest
2 голосов
/ 01 июня 2010

Создание исключения через croak в разветвленном дочернем процессе, похоже, печатает ошибку как фоновый процесс. То есть, это заглушает приглашение оболочки.

Если I 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 Получено :

$ perl -e '$SIG{__DIE__} = sub {sleep 1}; unless (fork) {die "child"}'
$ child at -e line 1.

Спасибо за помощь!

1 Ответ

3 голосов
/ 01 июня 2010

Я почти уверен, что это просто проблема времени. Версия die немного быстрее, поэтому у нее больше шансов вывести сообщение об ошибке, прежде чем оболочка сможет распечатать следующее приглашение. Когда я пытаюсь запустить ваши примеры, версия croak обычно печатается после приглашения, но иногда она появляется перед приглашением. Версия die довольно последовательно предшествует подсказке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...