我正在编写一个程序来解析10个网站,查找数据文件,保存文件,然后解析它们以生成可以在NumPy库中使用的数据.有吨的错误该文件通过遇到不良链接,不好的XML,缺项,其他的事情我还没有进行分类.我最初制作这个程序来处理这样的错误:
try:
do_stuff()
except:
pass
Run Code Online (Sandbox Code Playgroud)
但现在我想记录错误:
try:
do_stuff()
except Exception, err:
print Exception, err
Run Code Online (Sandbox Code Playgroud)
请注意,这是打印到日志文件以供以后查看.这通常会打印非常无用的数据.我想要的是打印错误触发时打印的完全相同的行,没有try-except拦截异常,但我不希望它暂停我的程序,因为它嵌套在一系列for循环中,我想看完成了.
我在Python中看到了很多关于堆栈跟踪和异常的帖子.但还没找到我需要的东西.
我有一大堆Python 2.7代码可能引发异常.我想抓住它并将一个字符串分配给它的完整描述和导致错误的堆栈跟踪(我们只是在控制台上看到的所有内容).我需要这个字符串将其打印到GUI中的文本框.
像这样的东西:
try:
method_that_can_raise_an_exception(params)
except Exception as e:
print_to_textbox(complete_exception_description(e))
Run Code Online (Sandbox Code Playgroud)
问题是:功能是什么complete_exception_description?
捕获将如此打印的异常:
Traceback (most recent call last):
File "c:/tmp.py", line 1, in <module>
4 / 0
ZeroDivisionError: integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)
我想将其格式化为:
ZeroDivisonError, tmp.py, 1
Run Code Online (Sandbox Code Playgroud) 这是处理生成器中抛出异常的后续操作,并讨论了一个更普遍的问题.
我有一个以不同格式读取数据的函数.所有格式都是面向行或面向记录的,每种格式都有一个专用的解析功能,作为生成器实现.因此主读取函数获取输入和生成器,它从输入读取其各自的格式并将记录传递回主函数:
def read(stream, parsefunc):
for record in parsefunc(stream):
do_stuff(record)
Run Code Online (Sandbox Code Playgroud)
在哪里parsefunc是这样的:
def parsefunc(stream):
while not eof(stream):
rec = read_record(stream)
do some stuff
yield rec
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,虽然parsefunc可以抛出异常(例如,当从流中读取时),但它不知道如何处理它.负责处理异常的read函数是主要功能.请注意,异常发生在每个记录的基础上,因此即使一个记录失败,生成器也应继续其工作并返回记录,直到整个流耗尽为止.
在上一个问题中,我试图放入next(parsefunc)一个try块,但事实证明,这不会起作用.所以我必须添加try-except到parsefunc自身,然后以某种方式向消费者提供例外:
def parsefunc(stream):
while not eof(stream):
try:
rec = read_record()
yield rec
except Exception as e:
?????
Run Code Online (Sandbox Code Playgroud)
我不愿意这样做因为
try在一个不打算处理任何异常的函数中使用是没有意义的parsefunc,我不想用太多的帮助代码来混淆它们.有没有人建议更好的架构?
我的团队用于Sentry跟踪错误,因此我不希望使用 Luigi 的内置电子邮件功能将所有报告保存在一个地方。
这就是我目前的设置方式,它似乎完全跳过了 Sentry:
if __name__ == '__main__':
try:
luigi.run()
except Exception as e:
client = Client(
***
)
client.captureException(tags={
sys.argv[0]
})
logger.critical('Error occurred: {e}'.format(e=e))
raise
Run Code Online (Sandbox Code Playgroud)