【发布时间】:2017-11-08 15:16:58
【问题描述】:
我正在通过exec 制作几个函数,这可能会出错。但是,当 Python 出错时,它不会显示发生错误的行。
例如使用:
fn_str = '''\
def fn():
raise Exception()
'''
globs = {}
exec(fn_str, globs)
fn = globs['fn']
fn()
给我们输出:
Traceback (most recent call last):
File "...", line 10, in <module>
fn()
File "<string>", line 2, in fn
Exception
但是,如果我们不要使用 eval。然后我们得到程序出错的那一行:
def fn():
raise Exception()
fn()
Traceback (most recent call last):
File "...", line 4, in <module>
fn()
File "...", line 2, in fn
raise Exception()
Exception
我已经研究过使用__traceback__,但是我找不到添加到“文件”行下的回溯的方法。所以我能得到的最好的结果是:
fn_str = '''\
def fn():
try:
raise Exception()
except BaseException as e:
tb = e.__traceback__
if 1 <= tb.tb_lineno <= len(fn_lines):
e.args = ((e.args[0] if e.args else '') + ' - ' + fn_lines[tb.tb_lineno - 1].strip(),)
raise
'''
globs = {'fn_lines': fn_str.split('\n')}
exec(fn_str, globs)
fn = globs['fn']
fn()
Traceback (most recent call last):
File "...", line 16, in <module>
fn()
File "<string>", line 3, in fn
Exception: - raise Exception()
这样做的最大问题是如果eval 调用其他代码,那么- raise Exception() 的来源就会变得混乱。
有没有办法让 eval 代码提供它出错的行?
【问题讨论】:
标签: python python-3.x traceback