如何捕获通过 exec() 执行的 ZeroDivisionError 的参数?
Ho to catch the arguments of a ZeroDivisionError executed via exec()?
我有几行代码需要通过 exec() 执行,我想知道哪一行正在上升 ZeroDivisionError。
举个例子:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
>>>exec(code)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-00bada8e7a44> in <module>()
5 print(c)
6 '''
----> 7 exec(code)
<string> in <module>()
ZeroDivisionError: division by zero
这很好,但我希望 c = a/b
而不是 exec(code)
作为异常的参数,因为它发生在其他类型的错误中:
code = \
'''
a = 9
b = 0
c === b
print(c)
'''
>>>exec(code)
File "<string>", line 4
c === b
^
SyntaxError: invalid syntax
在这种情况下,SyntaxError
直接指向导致错误的行。
为什么会有这种差异?
我怎样才能让 ZeroDivisionError
正确指向?
更新
我已经尝试了 Schore 建议的“compile()
解决方案”,但在我的情况下它没有按预期工作:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
z = compile(code, "", "exec")
>>>exec(z)
ZeroDivisionError Traceback (most recent call last)
<ipython-input-8-857f94e79b67> in <module>()
6 '''
7 z = compile(code, "", "exec")
----> 8 exec(z)
? in <module>()
ZeroDivisionError: division by zero
原因是除零错误是一个运行时错误,而 === 是一种 'compiler' 类型的错误(好吧,对于 Python 它是在 === 是被转换成计算机指令,它还没有真正的编译器)。
要获得正确的错误行,您可以将代码拆分为不同的行,并逐行执行(使用循环),然后打印导致异常的行。
你可以使用编译:
>>> code = \
... '''
... a = 9
... b = 0
... c = a/b
... print(c)
... '''
>>> c = compile(code, "", "exec")
>>> exec(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "", line 4, in <module>
ZeroDivisionError: integer division or modulo by zero
这样您就可以在不拆分代码的情况下获得行号。
我有几行代码需要通过 exec() 执行,我想知道哪一行正在上升 ZeroDivisionError。
举个例子:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
>>>exec(code)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-00bada8e7a44> in <module>()
5 print(c)
6 '''
----> 7 exec(code)
<string> in <module>()
ZeroDivisionError: division by zero
这很好,但我希望 c = a/b
而不是 exec(code)
作为异常的参数,因为它发生在其他类型的错误中:
code = \
'''
a = 9
b = 0
c === b
print(c)
'''
>>>exec(code)
File "<string>", line 4
c === b
^
SyntaxError: invalid syntax
在这种情况下,SyntaxError
直接指向导致错误的行。
为什么会有这种差异?
我怎样才能让 ZeroDivisionError
正确指向?
更新
我已经尝试了 Schore 建议的“compile()
解决方案”,但在我的情况下它没有按预期工作:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
z = compile(code, "", "exec")
>>>exec(z)
ZeroDivisionError Traceback (most recent call last)
<ipython-input-8-857f94e79b67> in <module>()
6 '''
7 z = compile(code, "", "exec")
----> 8 exec(z)
? in <module>()
ZeroDivisionError: division by zero
原因是除零错误是一个运行时错误,而 === 是一种 'compiler' 类型的错误(好吧,对于 Python 它是在 === 是被转换成计算机指令,它还没有真正的编译器)。
要获得正确的错误行,您可以将代码拆分为不同的行,并逐行执行(使用循环),然后打印导致异常的行。
你可以使用编译:
>>> code = \
... '''
... a = 9
... b = 0
... c = a/b
... print(c)
... '''
>>> c = compile(code, "", "exec")
>>> exec(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "", line 4, in <module>
ZeroDivisionError: integer division or modulo by zero
这样您就可以在不拆分代码的情况下获得行号。