【问题标题】:Python: Create a try except general purpose functionPython:创建除通用功能外的尝试
【发布时间】: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


【解决方案1】:

您是否尝试过传入 lambda 函数?

exception(lambda: data.split('/'))

在你的函数内部:

def exception(a, nr_repeat=5):
if nr_repeat != 0:
    try:
        a()
        nr_repeat = 0
    except ExceptionType:
        exception(a, nr_repeat-1)

在您调用 lambda 之前,它不会被计算。

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2021-03-07
    • 1970-01-01
    • 2017-02-25
    • 2021-01-28
    相关资源
    最近更新 更多