2016-03-03 45 views
0

我有一个装饰器,它包装从鼻子测试用例中产生的发生器。对于每一次迭代,如果发生异常,我希望捕获并运行特定的拆卸,但它看起来并不像预期的那样。在装饰器中捕捉发生器的异常

def print_log(test_case): 
    @wraps(test_case) 
    def run_test(self): 
     try: 
      for _ in test_case(self): pass 
     except: 
      Test_Loop.failure_teardown(self) 
      raise 
    return run_test 

有什么我做错了吗?

回答

0

我不确定究竟是什么意外的行为,但也许这是因为你没有单独尝试每个循环迭代。

也许这会工作吗?

def print_log(test_case): 
    @wraps(test_case) 
    def run_test(self): 
     from six.moves import next 
     test_iter = iter(test_case(self)) 
     while True: 
      try: 
       next(test_iter) 
      except StopIteration: 
       break 
      except Exception: 
       Test_Loop.failure_teardown(self) 
       raise 
    return run_test 
+0

意外的行为是它甚至没有达到预期的区块。为了测试,我强制在yield函数中的某处发生异常,并且它被唤起,但它只是继续进行常规拆卸,而不是我写的特定拆解。 – ILostMySpoon