何以捕获通过exec()执行的ZeroDivisionError的参数?

时间:2016-05-04 14:04:31

标签: python error-handling 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 

2 个答案:

答案 0 :(得分:2)

原因是零分割错误是运行时错误,===是编译器&#39;一种错误(好吧,对于Python来说,当===被转换成计算机指令时,它就找不到它了。)

如何获得正确的错误行是将代码拆分为单独的行并逐个执行(带循环),并打印导致异常的行。

答案 1 :(得分:1)

你可以使用compile:

>>> 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

这样您就可以在不拆分代码的情况下获得行号。