引发错误并不会阻止try-except子句被执行?

时间:2016-09-07 09:33:20

标签: python exception try-except raise

在测试一段看起来有点像这样的代码时,我感到很惊讶:

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)

我预计如果db中没有提供id(x)的项,则会引发NotFound异常。但是,在获得if子句并打印调试消息之后,它会转到except子句并引发Exception(exc消息是找不到Item ...)。有人可以这么善良并在这里启发我吗?

2 个答案:

答案 0 :(得分: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来捕获特定的您知道如何处理的事情。

答案 1 :(得分:-1)

如果obj是数组,请检查项目的长度或数量是否为零 这意味着obj不是没有但不包含项目