web-dev-qa-db-ja.com

エラーをファイルに記録し、例外で失敗しないようにする方法

ネットからファイルをダウンロードしているのですが、それでも失敗します。

クエリのpの場合:

try:

except IOError as e:
   print e;

エラーがある場合は、ログに記録してから、次のファイルに進みます。

このループでは、画像をダウンロードしようとしています。何らかの理由でファイル名が悪かったり、Webサイトがダウンしたりした場合などは、forループの次の項目に進みます。

失敗せず処理を続行しない、より一般的なエラーはありますか?

また、エラーをファイルに記録するにはどうすればよいですか?

22
Blankman

Lottが指摘したように、ダウンロードが失敗した場合は、問題が上流で(またはダウンロードアドレスで)修正されない限り、再試行してください。ただし、ダウンロードのリストがあり、終了せずに失敗したダウンロードをスキップしたい場合は、次のようにします。

logf = open("download.log", "w")
for download in download_list:
    try:
        # code to process download here
    except Exception as e:     # most generic exception you can catch
        logf.write("Failed to download {0}: {1}\n".format(str(download), str(e)))
        # optional: delete local version of failed download
    finally:
        # optional clean up code
        pass

注意事項:

(1)〜_ututbuによって提案されているように、「logging」モジュールを使用すると、タイムスタンプを含め、さまざまなチャネル(stderr、ファイルなど)に同時に書き込むことで、ログ出力の柔軟性と能力が大幅に向上します。エラーレベルなどによる.

(2) "with"構文を使用して上記のロジックを実装することを検討してください。

16
Jeet

logging module を使用できます:

import logging
logging.basicConfig(filename='/tmp/myapp.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)

try:
    1/0
except ZeroDivisionError as err:
    logger.error(err)

スクリプトを実行すると、/ tmp/myapp.logに書き込まれます。

% cat /tmp/myapp.log 
2010-08-01 17:50:45,960 ERROR __main__ integer division or modulo by zero
22
unutbu

これにより、エラーがログファイルに書き込まれ、コードの実行が続行されます。

import traceback

#This line opens a log file
log = open("log.txt", "w")

try:
    # some code
    # Below line will print any print to log file as well.
    print("Creating DB Connection", file = log)
except Exception:
    traceback.print_exc(file=log)
    continue
8
Avinav Mishra

これはすべてをキャッチします。しかし、正確な例外をキャッチする方がはるかに優れています。 python <= 2.7

while True:
  try:
    doStuff()
  except Exception, e:
    f = open('log.txt', 'w')
    f.write('An exceptional thing happed - %s' % e)
    f.close()
3
nate c