Подавить «СБОЙ при запуске — компиляция прервана»

#perl

#perl

Вопрос:

У меня есть модуль, который должен выполнить некоторую проверку в начальном блоке. Это не позволяет пользователю увидеть бесполезное сообщение в строке (на этапе компиляции, см. Второе НАЧАЛО здесь).

Проблема в том, что если я умру внутри 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:

Когда 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};
  

Комментарии:

1. Спасибо! Теперь все, что я получаю, это: Some needed modules are missing or must be upgraded before configuring Alien::GSL. Those modules are: Sort::Versions

2. Я должен сказать, что это то, чего я хотел!