perl:在出现故障时捕获GetOptions

perl:在出现故障时捕获GetOptions,perl,getopt,Perl,Getopt,使用Getopt::Long,我希望捕获GetOptions中的任何失败,而不是将它们打印到STDOUT/STDERR,我希望打印出一个用法字符串并退出脚本。我尝试将对GetOptions的调用包装在Try::TinyTry/catch块中,但没有被捕获。我不知道这里的幕后发生了什么 我如何在GetOptions中捕获失败,阻止它打印,并打印我自己的用法语句?它使用warn,因此您可以使用$SIG{uuuuu warn}。我想说,除了由GetOptions发现的特定错误之外,最好提供一个用法声明

使用
Getopt::Long
,我希望捕获
GetOptions
中的任何失败,而不是将它们打印到STDOUT/STDERR,我希望打印出一个用法字符串并退出脚本。我尝试将对
GetOptions
的调用包装在
Try::Tiny
Try/catch
块中,但没有被捕获。我不知道这里的幕后发生了什么


我如何在
GetOptions
中捕获失败,阻止它打印,并打印我自己的用法语句?

它使用
warn
,因此您可以使用
$SIG{uuuuu 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.");
}
子用法{
my$prog=basename($0);
如果(我的($msg)=@\{
咀嚼(味精);
警告(“$msg\n”);
}
警告(“有关详细信息,请尝试“$prog--help”。\n”);
出口(1);
}
辅助帮助{
my$prog=basename($0);
打印(以下是我的工作:

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

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

if ( $@ ) {
  ...
}
例如,请参见
\uuuu WARN\uuuu
钩子上的。但我也会留下
Getopt
的消息,因为它们很好,并添加我自己的消息。