如何给exec代码有意义的位置来显示异常?

时间:2015-03-04 13:44:22

标签: python

下面给exec的代码将在没有编译错误的情况下传递,但会在“error”语句中导致运行时错误:

globs = {}

exec('''
def main():
    print('Hello Python')
    error  # Makes run-time error
''', globs)

globs['main']()

错误消息是:

    Traceback (most recent call last):

      File "C:\work\sandbox.py", line 11, in 
        globs['main']()
      File "<string>", line 4, in main
    NameError: name 'error' is not defined

File "<string>", line 4, in main的位置信息不是很有用,例如在尝试找到可以来自文件的代码的来源时。

请注意,以上是显示问题的简化示例。在实际程序中,代码定义了在主程序中不同位置执行的几个函数。

是否有某种方法可以将exec中的代码提供给“&lt; string&gt;”以外的其他位置,如果exec代码中出现异常,则会显示其他位置?

2 个答案:

答案 0 :(得分:5)

你可以先compile你的代码并给它一个文件名参数:

code = compile('error', 'foo.py', 'exec')
exec(code)

输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "foo.py", line 1, in <module>
NameError: name 'error' is not defined

答案 1 :(得分:0)

将您exec的代码写入文件,并run it

或者更好的是,首先接受来自文件的代码输入。这可能更安全,并使代码更容易审核。如果需要该功能,它还使用户更容易在以后更改它。

您应该避免将exec用于您无法控制的代码 - 这非常危险。除非您编写程序生成的代码,否则没有理由使用它。