Python 引发错误不阻止执行try-except子句?
在测试一段看起来有点像这样的代码时,我感到惊讶:Python 引发错误不阻止执行try-except子句?,python,exception,try-except,raise,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 Exceptio
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不是无但不包含项目如果obj是数组,请检查项目的长度或计数是否为零
这意味着obj不是无而是不包含项当你说
除异常外,e:
,你明确地捕捉到(几乎)在该块中可能引发的任何异常——包括你的未找到的
如果希望NotFound
本身进一步向上传播,则根本不需要使用try/except
块
或者,如果您想在检测到NotFound
时执行某些特定操作,但随后继续传播同一异常,则可以使用空白的raise
语句重新引发该异常,而不是像现在这样引发新异常;比如:
try:
# .. do stuff
if blah:
raise NotFound(...)
except NotFound, e:
# print something
raise
还请注意,我已将异常块更改为
except NotFound
——使用exception
通常不是一个好主意,因为它捕获所有内容,这可能会隐藏您可能没有预料到的错误。基本上,您希望使用,除了
,来捕获您知道如何处理的特定事情 当您说异常除外,e:
时,您明确地捕获了(几乎)该块中可能引发的任何异常,包括您的未找到的
如果希望NotFound
本身进一步向上传播,则根本不需要使用try/except
块
或者,如果您想在检测到NotFound
时执行某些特定操作,但随后继续传播同一异常,则可以使用空白的raise
语句重新引发该异常,而不是像现在这样引发新异常;比如:
try:
# .. do stuff
if blah:
raise NotFound(...)
except NotFound, e:
# print something
raise
还请注意,我已将异常块更改为except NotFound
——使用exception
通常不是一个好主意,因为它捕获所有内容,这可能会隐藏您可能没有预料到的错误。基本上,您希望使用,除了
,来捕获您知道如何处理的特定事情 您正在引发一个NotFound
,捕获它,然后引发一个错误。你以为会发生什么?好吧,我现在明白了。加薪并没有逃脱这一条款,而是被抓住了。我真丢脸:)你提出了一个NotFound
,捕获了它,然后提出了一个错误。你以为会发生什么?好吧,我现在明白了。加薪并没有逃脱这一条款,而是被抓住了。不好意思:)谢谢,但obj不是。。。我已经做了一些调试,Fanny正在测试如果obj没有:
,而不是如果obj:
,那么空列表的“错误”在这里不适用。谢谢,但是obj没有。。。我做了一些调试,Fanny正在测试如果obj没有:
,而不是如果obj:
,所以空列表的“错误”在这里不适用。我这样解决了:try:except NotFound:blah除了异常blah。我想要的是检查是否找到该项,如果没有,则引发NotFound,然后,如果没有引发,则检查所有其他问题(我知道异常是一个过于宽泛的术语,在我的情况下可能是一些db错误)。我的主要错误是假设raisenotfound会被提升为NotFound,有点“突破”子句,而不是被抓住并导致错误。我需要阅读更多关于异常的内容。无论如何,我会接受你的答案:)我是这样解决的:try:except-NotFound:blah-Exception-blah-blah。我想要的是检查是否找到该项,如果没有,则引发NotFound,然后,如果没有引发,则检查所有其他问题(我知道异常是一个过于宽泛的术语,在我的情况下可能是一些db错误)。我的主要错误是假设raisenotfound会被提升为NotFound,有点“突破”子句,而不是被抓住并导致错误。我需要阅读更多关于异常的内容。无论如何,我会接受你的回答:)