perl:在出现故障时捕获GetOptions

时间:2017-07-26 20:08:32

标签: perl getopt

使用Getopt::Long,我希望从GetOptions捕获任何失败,而不是将它们打印到STDOUT / STDERR,我想打印出Usage字符串并退出脚本。我尝试将调用包裹在GetOptions Try::Tiny块中的try/catch,但它并没有被抓住。我不确定幕后会发生什么。

如何捕获GetOptions中的故障,阻止其打印,并打印我自己的使用说明呢?

2 个答案:

答案 0 :(得分:1)

它使用warn,因此您可以使用$SIG{__WARN__}。我会说除了GetOptions找到的特定错误之外,还提供一个使用声明会更好。

sub usage {
   my $prog = basename($0);
   if (my ($msg) = @_) {
      chomp($msg);
      warn("$msg\n");
   }

   warn("Try `$prog --help' for more information.\n");
   exit(1);
}

sub help {
   my $prog = basename($0);
   print(<<"__EOS__");
usage: $prog [options] [--] {foo} {bar}
       $prog --help

Options:
   ...
__EOS__
   exit(0);
}

sub parse_args {
   GetOptions(
      'h|?|help' => \&help,
      ...,
   )
      or usage();

   @ARGV == 2
      or usage("Too many arguments.");
}

答案 1 :(得分:0)

这就是我的所作所为:

eval {
    local $SIG{__WARN__} = sub { die $_[0] };

    GetOptions( \%opt, ... );
  };

if ( $@ ) {
  ...
}