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

45 投票
5 回答
147251 浏览
提问于 2025-04-16 02:09

我正在从网上下载一个文件,但下载失败了,尽管我已经这样做了:

for p in query:

    try:
    
    except IOError as e:
       print e;

如果出现错误,我想记录下来,然后继续处理下一个文件。

在这个循环中,我试图下载一张图片,如果因为某些原因文件名不对,或者网站无法访问等等,我想继续处理循环中的下一个项目。

有没有一种更通用的错误处理方式,可以避免失败并继续处理?

另外,我该如何把错误记录到一个文件里呢?

5 个回答

20

这段代码会把你的错误信息写入一个日志文件里,然后继续执行后面的代码。

import traceback

#This line opens a log file
with open("log.txt", "w") as log:

    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
55

你可以使用日志模块

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
37

正如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) 使用“logging”模块,正如~unutbu建议的那样,可以让你的日志输出更加灵活和强大,比如可以加上时间戳,根据错误级别同时写入不同的地方(比如错误输出、文件等)。

(2) 你可以考虑用“with”这个结构来实现上面的逻辑。

撰写回答