【问题标题】:Python continue from the point where exception was thrownPython 从抛出异常的地方继续
【发布时间】:2012-06-27 03:14:18
【问题描述】:

嗨,有没有办法从抛出异常的地方继续? 例如,我有以下伪代码

unique code 1
unique code 2
unique code 3

如果我想忽略任何唯一代码语句的异常,我将不得不这样做:

try:
  #unique code 1
except:
  pass

try:
  #unique code 2
except:
  pass

try:
  #unique code 3
except:
  pass

但这对我来说并不优雅,而且我这辈子都不记得上次我是如何解决这种问题的......我想要的是类似的东西

try:
  unique code 1
  unique code 2
  unique code 3
except:
  continue from last exception raised

更新: 原因:我问这个问题的原因是上面的 3 行代码共享相同类型的异常,比如说,从数组中提取信息,在这种特殊情况下,我并不真正关心 value not in 的异常数组。

【问题讨论】:

  • 无论如何,使用这样的包罗万象的异常并不是一个好习惯。您应该捕获更具体的异常类型。
  • @Keith 我已经添加了原因,请参见上文。

标签: python exception try-catch continue


【解决方案1】:

将每个代码部分包装成一个函数,然后尝试在 for 循环中调用每个部分:

def code1():
    #unique code 1

def code2():
    #unique code 2

def code3():
    #unique code 3

for section in [code1, code2, code3]:
    try:
        section()
    except:
        pass

编辑:如果您仍在寻找另一种方式,您可以使用装饰器使每个调用“安全”购买返回任何错误而不是抛出它们。不确定这是否真的是 Pythonic 或做事的好方法,但它是一种方法:

def safe_call(fn):
    def wrapper(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except Exception as error:
            return error
    return wrapper

@safe_call
def code1():
    #unique code 1

@safe_call
def code2():
    #unique code 2

@safe_call
def code3():
    #unique code 3

code1()
code2()
code3()

【讨论】:

  • 这是一个很好的解决方法,还有其他更规范的方法吗?
【解决方案2】:

我们可以使用 while 循环:

#!/urs/bin/env python 

 check = 0
 while True:
     try:
         if check == 0:
             #unique_code_one ()  
             check += 1
         if check == 1:
             #unique_code_two () 
             check += 1 
         if check == 2:
             #unique_code_three() 
     except: 
         check = 2 

【讨论】:

  • 对不起,我没有仔细阅读您的问题。这是错误的答案
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2012-09-15
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多