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

Equ*_*Dev 5 python

下面给出的代码将exec在没有编译错误的情况下通过,但会在"error"语句中导致运行时错误:

globs = {}

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

globs['main']()
Run Code Online (Sandbox Code Playgroud)

错误消息是:

    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"<string>"以外的其他位置提供代码,所以如果exec代码中发生异常,则会显示其他位置?

And*_*zlo 5

您可以先为compile您的代码添加一个文件名参数:

code = compile('error', 'foo.py', 'exec')
exec(code)
Run Code Online (Sandbox Code Playgroud)

输出:

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