我有一个模块,需要在BEGIN块中进行一些检查。这样可以防止用户在一行中看到无用的消息(在编译阶段,请参见此处的第二个BEGIN)。

问题是,如果我在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.";
}

最佳答案

当您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};

关于perl - 禁止 “BEGIN failed--compilation aborted at”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7904510/

10-13 08:54