2016-05-13 66 views
0

例如:如何检测python中的try块是否引发异常?

class ExceptionMeta(type): 
    def __call__(cls, *args, **kwargs): 
    if exception_raised_from_try_block: 
     do_something 
    else: 
     do_something_else 

class TimeOutError(metaclass = ExceptionMeta): 
    pass 

try: 
    raise TimeOutError 
except Exception as e: 
    pass 

实际的问题是,我有一个代码块中,我在尝试有超时错误 - 除了块。每次发生TimeOut错误时,我都会在try中捕获它 - 除了block和发出5次重试。此TimeOut错误具有一个对象,该对象将收集错误跟踪以防引发异常,以便在调试问题时提供更多上下文。但每次在try块中引发异常时,该调用都会调用函数,并最终收集该错误的跟踪信息,这是我不想要的,因为我只是在除了块之外再次执行操作。是否有任何方法在Python使用检查或其他模块,可以告诉我,异常是从尝试块引发?

+3

你认为除了发生什么? –

+3

看起来你正在试图滤除可能未捕获的异常。那是对的吗?你能否进一步解释你为什么要这样做? –

+3

看起来好像你希望你的异常在被try块阻塞时有一个行为,如果没有被捕获到另一个行为,但它们只是一个信号 - 异常不应该有副作用。 –

回答

0

所以你的问题是重试的代码块...

假设你有这样一些代码:

import random 

def do_something_unreliable(msg="we have landed"): 
    if random.randint(0, 10) > 1: 
     raise Exception("Timed out...") 
    else: 
     return "Houston, {0}.".format(msg) 

您可以通过执行重试5次:

for attempt in range(1, 5): 
    try: 
     do_something_unreliable() 
    except Exception: 
     # print("timeout, trying again...") 
     pass 
    else: 
     break 
else: 
    do_something_unreliable() 

你可以通过这样做使其可重复使用:

def retry(fn, args=None, kwargs=None, times=5, verbose=False, exceptions=None): 
    if args is None: 
     args = [] 
    if kwargs is None: 
     kwargs = {} 
    if exceptions is None: 
     exceptions = (Exception,) 
    for attempt in range(1, times): 
     try: 
      return fn(*args, **kwargs) 
     except exceptions as e: 
      if verbose: 
       print("Got exception {0}({1}), retrying...".format(
         e.__class__.__name__, e)) 
    return fn(*args, **kwargs) 

然后,你可以写:

>>> retry(do_something_unreliable, verbose=True) 
Got exception Exception(Timed out...), retrying... 
Got exception Exception(Timed out...), retrying... 
Got exception Exception(Timed out...), retrying... 
'Houston, we have landed.' 

>>> retry(do_something_unreliable, ['we are lucky'], verbose=True) 
Got exception Exception(Timed out...), retrying... 
Got exception Exception(Timed out...), retrying... 
'Houston, we are lucky.' 

您还可以看看retrying装饰:

Retrying是Apache 2.0 行货通用重试库,用Python编写的,以 简化向任何事物添加重试行为的任务。

相关问题