Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 引发错误不阻止执行try-except子句?_Python_Exception_Try Except_Raise - Fatal编程技术网

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,有点“突破”子句,而不是被抓住并导致错误。我需要阅读更多关于异常的内容。无论如何,我会接受你的回答:)