我是python
的新手,但是我有使用nodejs, java
等其他语言的经验。我在python
中定义了一个函数,如下所示:
from flask import abort
def delete_contact(contact_id, api_key=None): # noqa: E501
print('delete contact ', contact_id)
session = Session()
try:
query = session.query(DBContact).filter(DBContact.id == contact_id)
print('delete count:', query.count())
if query.count() == 0:
print('return 404')
return abort(404, 'Not find record')
contact = query.one()
session.delete(contact)
session.commit()
return 'success'
except Exception as error:
print(error)
finally:
session.close()
print('xxxxx')
return abort(400, 'failed to delete contact ' + contact_id)
执行此代码时,我可以看到输出同时包含return 404
和xxxxx
。我不明白如果函数已经返回xxxxx
,为什么会打印return abort(404, 'Not find record')
。在类似java, javascript
的其他语言中,如果函数返回一个值,则除finally
块外,其余代码不应执行。但是print('xxxxx')
在finally
块之外。为什么执行?
答案 0 :(得分:1)
abort(404, 'Not find record')
引发一个HTTPException
,它被您的except
块捕获。
因此,永远不会到达return
语句的return abort(404, 'Not find record')
部分,而不是返回python,它将执行except
块,然后执行finally
块,然后执行后面的语句try-except-finally
语句。
该函数也不返回,因为该行
return abort(400, 'failed to delete contact ' + contact_id)
引发另一个HTTPException
,它将通过调用堆栈传播。
return
没有任何作用。
如果您想传播HTTPException
,但又不想传播其他异常,则可以执行以下操作:
try:
...
except HTTPException:
raise
except Exception as error:
print(error)
finally:
...
...
这将引发HTTPException
抛出的abort
,但是在第二个except
块中处理所有其他异常,然后继续执行该功能。