2017-07-26 111 views
0

使用Getopt::Long,我想從GetOptions捕獲任何失敗,而不是將它們打印到STDOUT/STDERR,我想打印出一個用法字符串並退出腳本。我嘗試在Try::Tinytry/catch區塊中打電話給GetOptions,但它沒有被捕獲。我不確定這裏幕後發生了什麼事。perl:當某事失敗時捕獲GetOptions

如何捕獲GetOptions中的故障,防止打印,並打印我自己的使用說明?

+0

參見[此帖](https://stackoverflow.com/a/44011471/4653379)(例如),在'__WARN__'掛鉤。但我也留下了'Getopt'的消息,因爲它們很好,並且添加了我自己的消息。 – zdim

回答

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."); 
} 
0

這是我做的:

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

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

if ([email protected]) { 
    ... 
}