2011-07-09 6 views

答えて

6

try..except..elseが必要ではないかもしれないが、それは素晴らしいことができます。この場合、try..except..elseフォームは明らかにより良いです、私の意見です。

構文の要素なしで行うことができるだけで、役に立たないとは限りません。デコレータ構文は純粋に構文砂糖(最も明白な例だと思います)、forループはちょうど賞賛されていますwhileループなど。 try..except..elseのための良い場所があり、私はこれがそのような場所の一つだと言います。

さらに、これらの2つのコードブロックは同等ではありません。 f.read()が例外(ディスクの読み込みエラー、ファイル内のデータの破損など)を発生させると、最初の例外は発生するはずの例外が発生しますが、2番目の例外は失われ、すべてが機能していると考えられます。 (これはあなたがfile.readfile.closeでエラーをキャッチすることを想定しており、私は本当に理由を見ることができない

try: 
    with open('foo', 'r') as f: 
     data = f.read() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

:自分のために、私は短く、まだ理解しやすくなり、これらの線に沿ってより多くの何かを、好みます)

+0

python 2.5が動作していて、そのコードを動作させることはできません。私は無効な構文を取得します。 –

+0

@eryksun:ああ、はい、それについて忘れました。私はちょうどPythonのドキュメントをチェックし、[With''ステートメント](http://docs.python.org/reference/compound_stmts.html#with)には「バージョン2.5の新機能」と書かれています。必要な '__future__'インポートについて言及することなく、' except as'を考えました。 Pythonドキュメントの「複合ステートメント」ページには、いつ追加されたかについては言及されていません...そして、私は本当に覚えていません。 –

+0

おかげで大変感謝しています –

0

は実際に、常に必要とされていないあなたは、単に行うことができます。

f = None 
try: 
    f = open('foo', 'r') 
except IOError: 
    error_log.write('Unable to open foo\n') 
if f: 
    data = f.read() 
    f.close() 
+0

しかし、 'AttributeError'を発生させる' None'に対して 'read()'を呼び出すことになりました。 –

+0

は申し訳ありません!私はまだ編集中だった。 –

+0

'もしそうでなければ'が働くことは確かですか?私はそれが 'fなら'だと思う。 –