2016-09-07 97 views
1

在测试的一段代码,看起来有点像,我已经得到了一惊:引发错误不会阻止try-except子句执行吗?

if x: 
    try: 
      obj = look-for-item-with-id==x in a db 
      if obj is None: 
       # print debug message 
       raise NotFound('No item with this id') 
      return obj 
    except Exception, e: 
     raise Error(e.message) 

我预计,如果没有项目,在一个数据库提供的ID(X),该NotFound异常会被抚养。但是,在获得if子句并打印调试消息后,它会转到except子句并引发异常(exc消息是Item not found ...)。有人可以这样善良,在这里启发我吗?

+2

您正在引发'NotFound',捕获它,然后引发'Error'。你期望会发生什么? – tzaman

+0

好吧,我现在明白了。加注并不是逃避条款,而是被抓住。耻辱在我:) – fanny

回答

1

当你说except Exception, e:,你明确地捕捉(几乎)任何例外可能在该区块内得到提升 - 包括您的NotFound

如果你想NotFound本身进一步传播,你根本不需要有一个try/except块。

另外,如果您想在检测NotFound但随后继续传播同样的异常做一些具体的,你可以使用空白raise语句来重新提升它,而不是提出新的异常,像你所做的事。是这样的:

try: 
    # .. do stuff 
    if blah: 
    raise NotFound(...) 
except NotFound, e: 
    # print something 
    raise 

另外请注意,我已经改变了异常块到except NotFound - 这是通常不使用except Exception,因为它抓住了一切,它可以隐藏你可能没有预期的错误是一个好主意。基本上,你想用except捕捉特定你知道如何处理的东西。

+0

我解决它就像那样:尝试:除了NotFound:等等,除了例外等等等等。我想要的是检查项目是否被找到 - 如果没有,找到RAISE NotFound,然后,如果没有提出,检查所有其他问题(我知道异常是一个过于宽泛的术语,它应该可能是一些数据库错误在我的情况)。我的主要错误是假设提高NotFound会被提升为NotFound,这会“破坏”该子句,不会被捕获并导致错误。我需要阅读更多关于例外的内容。无论如何,我会接受你的回答:) – fanny

-1

如果obj阵列请检查长度或项目的计数为零 这意味着OBJ不是没有,但不包含项目

+0

谢谢,但obj是无...我已经做了一些调试 – fanny

+1

范妮正在测试'如果obj是None:',而不是'如果obj:',所以空的“虚假”列表不适用于此。 –