如何将错误记录到文件,并在异常时不失败
我正在从网上下载一个文件,但下载失败了,尽管我已经这样做了:
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
”这个结构来实现上面的逻辑。