Подавить "НАЧАЛО сбой - компиляция прервана в" - PullRequest
6 голосов
/ 26 октября 2011

У меня есть модуль, который должен выполнить некоторую проверку в блоке BEGIN. Это препятствует тому, чтобы пользователь видел бесполезное сообщение вниз по линии (во время фазы компиляции, замечено во втором, НАЧИНАЕТСЯ здесь).

Проблема в том, что если я умру внутри, НАЧИНАЕТСЯ сообщение, которое я выбрасываю BEGIN failed--compilation aborted at. Тем не менее, я предпочитаю от die до exit 1, так как тогда это можно будет отловить. Должен ли я просто использовать exit 1 или я могу что-то сделать для подавления этого дополнительного сообщения?

#!/usr/bin/env perl

use strict;
use warnings;

BEGIN {
  my $message = "Useful message, helping the user prevent Horrible Death";
  if ($ENV{AUTOMATED_TESTING}) {
    # prevent CPANtesters from filling my mailbox
    print $message;
    exit 0;
  } else {

    ## appends: BEGIN failed--compilation aborted at
    ## which obscures the useful message
    die $message;

    ## this mechanism means that the error is not trappable
    #print $message;
    #exit 1;

  }
}

BEGIN {
  die "Horrible Death with useless message.";
}

1 Ответ

11 голосов
/ 26 октября 2011

Когда вы die, вы генерируете исключение, которое ловится на более раннем уровне вызова. Единственный обработчик, который поймает die из вашего блока BEGIN, это компилятор, который автоматически присоединяет строку ошибки, которую вы не хотите.

Чтобы избежать этого, вы можете либо использовать найденное вами решение exit 1, либо установить новый обработчик матрицы:

# place this at the top of the BEGIN block before you try to die

local $SIG{__DIE__} = sub {warn @_; exit 1};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...