在测试一段看起来有点像这样的代码时,我感到很惊讶:
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 ...)。有人可以这么善良并在这里启发我吗?
答案 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不是没有但不包含项目