2016-09-14 9 views
2

TL; DR:モジュールがすべてのエラーを記録していない場合、どのような種類のエラーをキャッチしますか?モジュールがすべてのエラーを記録していない場合、どのエラーをキャッチしますか? (plistlib)

シナリオ

私はplistlibを使用してproperty listsのシリーズを読みしようとしています。私はファイルを制御できません。ファイルを読み込めなかった場合は、スキップします。

私の質問はどのようなエラーを捕まえるべきですか?

plistlib.readPlist文書IOErrorおよびxml.parsers.expat.ExpatError

しかし、入力ファイルの不正な形式によっても少なくともIndexErrorAttributeErrorが生成される可能性があります。これらはplistlibには記載されていません。他のランダムな入力ファイルがどのような追加エラーを生成するかは誰が知っていますか?私は私のプログラムがそのために失敗するのを望んでいません。

私の質問はそうです。私は何を捕まえるべきですか?私の理解は、exceptのエラーをキャッチすることは、KeyboardInterruptのような他のエラーをマスクするので好まれません。これはコマンドラインアプリケーションなので、私はそのようなイベントを無視したくありません。

コード

import plistlib 
import sys 

def main(): 
    paths = [] # from sys.argv 

    for path in paths: 
     try: 
      plist = plistlib.readPlist(path) 
     except: # What to catch here? 
      sys.stderr.write('Couldnt read plist. Ignoring.') 
      continue 

     process(plist) 

のPython 2.7、OS Xの

+1

'Exception:'または 'Exception as e:'を除いてはおそらく、未知の例外の型を扱う最も一般的な方法です。下記のようにSteveが示唆しています。もう1つのオプションは、except:を持って、exceptブロックでe = sys.exc_info()[0] 'を使って例外インスタンス[[1](https://wiki.python.org/ moin/HandlingExceptions)]。結果はかなり似ているはずです。 –

+0

ありがとうございます。私はこれに対処するベストプラクティスを探していました。これは助けになった! – tombardey

+1

もう一つのベストプラクティスは、ライブラリのソースコードをチェックアウトし、 'rsise'を検索して例外のインベントリを取得することです。 –

答えて

3

あなたが任意のより良い行うことができない場合は、except Exception:KeyboardInterruptSystemExitをキャッチ避けることができます。

ただし、StopIterationGeneratorExitをキャッチします。可能であれば、イテレータ以外のコードではStopIterationをエスケープさせるのは間違っていると考えられるため、StandardError(これを除く)をキャッチすることができます。しかし、誰が知っているのでしょうか、おそらく、ライブラリがnextを使い果たされたイテレータに呼び出され、それをキャッチしないようにする入力があります。

StandardErrorはまだ入力が悪いのではなく、プログラマーのエラーの指標であるSyntaxErrorTypeErrorです。しかし、LookupErrorMemoryError(いずれもこれをキャッチするのに適しています)の両方を受け取り、SyntaxErrorではない単一のクラスはありません。つまり、コードが実際に何を投げるのかを判断するために、ドキュメンテーションや広範なテストを行わなくても行けます。

MemoryErrorは、エラーが一時的(別の日または別のマシンで動作するか)か、永続的か(入力ファイルが非常に大きいため、考えられるマシンでは処理できないことを知るには不十分です。

+0

ありがとう、これは多くの助けになりました。私はしばらくのための軽いスクリプトのためにPythonを使用しましたが、本当にそれを正しく学ぶための時間を取ったことはありません。あなたの答えは私に例外階層を掘り下げる機会を与えました。私は 'BaseException'と' Exception'の違いを知りませんでした。それはすでに良い区別です。今のところ、私は 'StandardError'と一緒に行きます。 – tombardey

関連する問題