首先,我知道eval的缺点,它将用于我想做的实验。
我正在创建一个像Brute-Force算法一样工作的脚本,但它不会破坏密码,而是找到一个特殊形式的方程式解决方案(更多细节是不必要的)。
会有很多字符串填充(通常语法不正确)的术语,如 1 + 2)+3
eval
获取这些字词结果的唯一方法吗?eval
中发生的语法错误? (该计划不应终止)答案 0 :(得分:6)
取消SyntaxError
:
try:
eval("1 + 2) + 3")
except SyntaxError:
pass
答案 1 :(得分:3)
使用来自ast的literal_eval并捕获ValueError和SyntaxError
from ast import literal_eval
try:
a = literal_eval('1+2)+3')
except (ValueError, SyntaxError):
pass
答案 2 :(得分:1)
Eval通常会引发SyntaxError,您可以使用
覆盖代码try:
a = eval('1+2)+3')
except SyntaxError:
pass
请记住,您可以隔离eval
访问通过{ '__builtin__': None }
作为第二个参数的任何函数。
答案 3 :(得分:1)
除了SyntaxError之外,还有更多可能的例外:
ZeroDivisionError,例如"1/0"
NameError,例如"franz/3"
(未定义franz
)
TypeError,例如"[2, 4]/2"
甚至更多。所以,你可能想要抓住它们:
try:
eval (expr)
except (SyntaxError, NameError, TypeError, ZeroDivisionError):
pass
实际上,几乎所有现有的异常都可以抛出,任何代码的评估都可能造成任何破坏,除非你屏蔽掉函数(例如os.system ("rm -rf /")
,另请参阅{{3} })。