我是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
。我不明白如果函数已经返回了return abort(404, 'Not find record')
,为什么xxxxx
会被打印出来。在java, javascript
等其他语言中,如果函数返回值,则除了finally
块之外,其余代码不应执行。但是print('xxxxx')
在finally
块之外。为什么要执行?你知道吗
abort(404, 'Not find record')
引发一个HTTPException
,它被except
块捕获。你知道吗因此
return abort(404, 'Not find record')
语句的return
部分永远不会到达,python将执行except
块,然后执行finally
块,然后执行try-except-finally
语句,而不是返回。你知道吗然后函数也不会返回,因为
引发另一个
HTTPException
,它将通过调用堆栈传播。你知道吗他们什么也不做。你知道吗
如果要传播
HTTPException
,但不传播其他异常,可以执行以下操作:这将引发
abort
抛出的HTTPException
,但会处理第二个except
块中的所有其他异常,然后继续该函数。你知道吗相关问题 更多 >
编程相关推荐