2011-10-26 42 views
5

BEGINブロックで何らかのチェックを行う必要があるモジュールがあります。これにより、ユーザは、無駄なメッセージが表示されるのを防ぐことができます(コンパイルフェーズ中、ここの2番目のBEGINに表示されています)。「BEGINが失敗しました - コンパイルが終了しました」

問題は、私がBEGINの中で死ぬと投げたメッセージが後ろに埋もれてしまうということです。 BEGIN failed--compilation aborted at。しかし、私はdieexit 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."; 
} 

答えて

10

あなたは以前の呼び出しレベルで引っ掛かり、例外を投げているdieBEGINブロックのdieをキャッチするハンドラはコンパイラであり、不要なエラー文字列が自動的に付加されます。これを避けるために

、あなたが見つけexit 1ソリューションを使用するか、新しい金型ハンドラをインストールすることができます

# place this at the top of the BEGIN block before you try to die 

local $SIG{__DIE__} = sub {warn @_; exit 1}; 
+0

感謝を!今度は私が得られるのは: 'Alien :: GSLを設定する前に、いくつかの必要なモジュールがないか、アップグレードする必要があります。 これらのモジュールは次のとおりです:\t Sort :: Versions' –

+0

私は言うべきです、これは私が望んだものです! –

関連する問題