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

raising error does not prevent try-except clause to get executed?

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

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 ...)。有好心人指教一下吗?

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

当您说 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 来捕捉 特定的 您知道如何处理的事情。