如何将错误记录到文件,而不是在异常时失败

Bla*_*man 21 python logging exception

我正在从网上下载文件,即使我正在做,它也会失败:

对于查询中的p:

try:

except IOError as e:
   print e;
Run Code Online (Sandbox Code Playgroud)

如果有错误,我想记录它,然后继续下一个文件.

在这个循环中,我试图下载一个图像,如果由于某种原因文件名不好,或者网站关闭等等,我想继续使用for循环中的下一个项目.

是否有一个更通用的错误,不会失败并继续处理?

另外,如何将错误记录到文件中?

unu*_*tbu 20

您可以使用日志记录模块:

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)
Run Code Online (Sandbox Code Playgroud)

运行脚本在/tmp/myapp.log中写入:

% cat /tmp/myapp.log 
2010-08-01 17:50:45,960 ERROR __main__ integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)

  • 好的。但是下载还是坏了。这不会神奇地使它“[不] 失败并继续处理”。 (2认同)

Jee*_*eet 15

正如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
Run Code Online (Sandbox Code Playgroud)

注意事项:

(1)使用logging~unutbu建议的" "模块,可以为您的日志输出提供更大的灵活性和功能,包括时间戳,同时根据错误级别写入不同的通道(例如,stderr,file)等等等

(2)您可以考虑使用" with"构造实现上述逻辑.


小智 7

这会将您的错误写入日志文件,并继续运行代码。

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
Run Code Online (Sandbox Code Playgroud)

  • 使用“通过”,不使用“继续” (2认同)