【发布时间】:2015-10-25 16:55:58
【问题描述】:
对于我需要在很多地方使用的解析脚本,请尝试除块之外。我想我可以使用一个通用函数,它将需要评估的表达式用作参数。
我不能直接使用表达式作为参数,因为它会在进入 try except 块之前引发错误:
def exception(a, nr_repeat=5):
if nr_repeat != 0:
try:
a
nr_repeat = 0
except ExceptionType:
exception(a, nr_repeat-1)
所以,我开始传递 a ,将表达式作为字符串进行计算,并使用 exec:
def exception(a, nr_repeat=5):
if nr_repeat != 0:
try:
exec(a)
nr_repeat = 0
except ExceptionEx:
exception(a, nr_repeat-1)
如果表达式不使用变量,这是有效的。如果它使用变量,即使我将 then 传递给该函数也不起作用。
def exception(a, nr_repeat=5,*args):
if nr_repeat != 0:
try:
exec(a)
nr_repeat = 0
except ExceptionEx:
exception(a, nr_repeat-1)
功能:
exception("print('blue)") - working
exception("data.split('/')") - not working
ExceptionEx 只是不同异常的占位符
【问题讨论】:
-
做这些事情的典型方法是传递可调用对象,而不是字符串(例如 lambdas 或函数指针)。您是否有特定要求使您使用包含代码的字符串?
-
如果有的话,传递一个
lambda并运行它,而不是exec一个字符串。但是,如果您经常需要运行任意代码,如果它引发错误则应该重试 5 次......这似乎是一种非常奇怪的 *cough*misguided*cough* 方法。其中有多少是占位符示例代码,又有多少是严重的? -
数据应该从哪里来?我越看你的代码,我就越觉得有更好的方法来做你真正想做的事情
-
我猜你也可以创建自己的上下文管理器?
-
@deceze 重复尝试做某事是为失败而设计的环境中的常见方法,例如。 G。网络或类似的。如果我现在无法访问该服务器,我会在 1 秒内重试,然后在 5 秒内重试,然后在 30、180、3600 秒内重试。然后我放弃并报告失败。 (当然,至少这是一种方法,具体取决于具体情况,但有一个用例。)
标签: python error-handling try-catch exec except