3

これはオープンエンドまたは厄介な質問かもしれませんが、それらを処理するための「最良の」アプローチがわからないという例外処理の問題にますます遭遇していることに気づきました。

存在しないファイルで FileHandler を構成しようとすると、Python のログ モジュールは IOError を発生させます。モジュールはこの例外を処理せず、単に発生させます。多くの場合、ファイルへのパスが存在しない (したがってファイルが存在しない) ため、例外を処理して続行するには、パスに沿ってディレクトリを作成する必要があります。

すべてのユーザーが、適切なディレクトリを作成しない理由を尋ねてきたので、アプリケーションでこのエラーを適切に処理したいと考えています。

これを処理することにした方法を以下に示します。

done = False
while not done:
    try:
        # Configure logging based on a config file
        # if a filehandler's full path to file does not exist, it raises an IOError
        logging.config.fileConfig(filename)

    except IOError as e:
        if e.args[0] == 2 and e.filename:
            # If we catch the IOError, we can see if it is a "does not exist" error
            # and try to recover by making the directories

            print "Most likely the full path to the file does not exist, so we can try and make it"
            fp = e.filename[:e.rfind("/")]

            # See http://stackoverflow.com/questions/273192/python-best-way-to-create-directory-if-it-doesnt-exist-for-file-write#273208 for why I don't just leap
            if not os.path.exists(fp):
                os.makedirs(fp)

        else:
            print "Most likely some other error...let's just reraise for now"
            raise
    else:
        done = True

構成する必要がある N 個の FileHandlers があるため、このシナリオで発生させて修正する必要がある N 個の IOErrors があるため、ループ (または再帰) する必要があります。

これはこれを行う適切な方法ですか?私が知らない、または理解できない可能性のある、より良い、よりPython的な方法はありますか?

4

2 に答える 2

1

これは logging モジュールに固有のものではありません。一般に、Python コードは自動的に中間ディレクトリを自動的に作成しません。os.makedirs()通常は次のように、を使用して明示的にこれを行う必要があります。

if not os.path.exists(dirname):
    os.makedirs(dirname)

FileHandlerlogging によって提供される標準を、必要なチェックを行い、必要に応じて を使用してログ ファイルのディレクトリを作成するサブクラスに置き換えることができますos.makedirs()。次に、標準のハンドラーの代わりに、構成ファイルでこのハンドラーを指定できます。

于 2011-11-14T22:21:13.703 に答える
0

アプリの実行の開始時に一度だけ実行する必要があると仮定すると、最初にos.makedirs()存在を確認したり、ログ モジュールがエラーを発生させたりするのを待たずに、必要なすべてのディレクトリのみを実行します。その後、ロガーを開始しようとしてエラーが発生した場合は、おそらく既に行った方法で処理できます: エラーを出力し、ロガーを無効にします。ディレクトリを作成しようとしただけで、それ以上のことができました。ユーザーが偽の情報を提供したとしても、あなたは今より悪くなることはなく、ほとんどの場合は改善されます。

于 2011-11-14T21:27:01.470 に答える