【问题标题】:raising error does not prevent try-except clause to get executed?引发错误不会阻止 try-except 子句执行?
【发布时间】:2016-09-07 09:33:19
【问题描述】:

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

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 子句并引发异常(exc 消息是未找到项目...)。能不能有人这么好心来给我解惑?

【问题讨论】:

  • 您正在提升 NotFound,捕获它,然后改为提升 Error。你预计会发生什么?
  • 好的,我现在明白了。加薪并没有逃脱该条款,而是被抓住了。真丢脸:)

标签: python exception try-except raise


【解决方案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 来捕获您知道如何处理的特定 事物。

【讨论】:

  • 我这样解决了:try: except NotFound: blah blah except Exception blah blah。我想要的是检查是否找到了该项目 - 如果没有,则 RAISE NotFound ,然后,如果没有提出,检查所有其他问题(我知道 Exception 是一个过于宽泛的术语,它可能应该是一些db 错误在我的情况下)。我的主要错误是假设 raise NotFound 会被提升为 NotFound,有点“打破”条款,不会被抓住并导致错误。我需要阅读更多关于异常的内容。无论如何,我会接受你的回答:)
【解决方案2】:

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

【讨论】:

  • 谢谢,但 obj 是 None...我已经对此做了一些调试
  • fanny 正在测试 if obj is None:,而不是 if obj:,因此这里不适用空列表的“虚假性”。
猜你喜欢
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2020-12-11
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多