2009-08-26 7 views
1

私のアプリケーションでは、XML :: Simpleを使用して、エクスポートされたXMLin()を使用してXMLファイルを解析します。無効なファイルパスがXMLin()のパラメータとして使用されるまで、すべてうまくいく。XMLinが鳴ったときにアプリケーションが終了しないようにするにはどうすればよいですか?

無効なファイルパスが与えられたときにXML :: Simpleがdie()または類似のメソッドを使用したため、アプリケーションが終了します。

XML :: Simpleがフォルトを満たしていても、アプリケーションを実行し続けたいです。だから何をすべきか?

+0

XMLin()を盲目的に呼び出す前にファイルの存在をチェックするだけではどうですか?私はパーサーに有効な引数を提供するのはあなたのコードの責任だと思うでしょう。 –

+2

@ire_and_cursesチェックと 'XMLin'の間でファイルが削除されたり、権限が変更される可能性があります。 'eval'に' XMLin'をラップするのが最善です。 'eval'はPerlの例外処理機構です。 –

答えて

6

を例外を処理します。

一般的な方法:そこに

use English qw(-no_match_vars); 

eval { 
    run_your_code_that_might_die(); 
}; 

if (my $error = $EVAL_ERROR) { 
    die $error unless $error =~ m{some|known|error}; 
    handle_known_error($error); 
} 

英語は私は$EVAL_ERRORの代わり[email protected]を使用することができるだけで。

一般に、perldoc for eval functionをチェックします。

+1

私は情熱を持って 'English.pm'が嫌いですが、+1します。 –

+0

@Sinan - なぜですか?私は好奇心が強い、危害はない/動くことは意図していません:) –

+2

英語には多くの長い名前がありますが、それは説明的です。また、qw(-no_match_vars)を使用しない場合は、 perlは$ '、$ '、$&(およびその長い名前の英語.pmの対応物)を入れるため、正規表現があればあなたのプログラムに大きな減速を導入します。 –

5

ブロックのevalで呼び出しをラップ:

eval { 
    do_stuff_that_might_die(); 
    1; 
} or do { 
    # Only executes if the call died, in case you want 
    # to do any cleanup or error handling 
    print "It died, but life goes on!\n"; 
}; # <-- Don't forget the semicolon! 
+1

'do_stuff_that_might_die()'が偽の値を返す場合を除き、あなたのサンプルは良いです、あなたのエラーメッセージは間違っています。 evalの最後に '1;'を追加して修正することができます。 – daotoad

+0

ああ、良い点 - それをキャッチするために感謝!これを追加するコードを編集しました。 –

関連する問題