python - 如何捕获通过 exec() 执行的 ZeroDivisionError 的参数?

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

最佳答案

原因是零除错误是一个运行时错误,而 === 是一种“编译器”错误(嗯,对于 Python 来说,当 === 转换为计算机指令时,它有不是真正的编译器)。

要获得正确的错误行,您可以将代码拆分为单独的行,并逐行执行它们(使用循环),然后打印导致异常的行。

关于python - 如何捕获通过 exec() 执行的 ZeroDivisionError 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37030138/

相关文章:

Python C/C++ 包装器与纯 C/C++ 性能

python - 如何从同步中获取所有更改号码 - p4python

R:使用 RGDAL 和 RASTER 包时抛出错误

c - fork() 后数组改变值

php - 命令不适用于 PHP exec() 但如果通过提示运行则运行正常

php - 通过 php exec 函数传递 $_SERVER 数组

python - 在同一数据库上同时使用 SQLAlchemy 和 Django ORM

python - 无法通过pip安装bob包

android - Android Studio 未找到默认 Activity 错误

c - C 中的无效输入