python函数返回语句是如何工作的?
我不熟悉python函数返回语句是如何工作的?,python,flask,Python,Flask,我不熟悉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(DBCo
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)
执行此代码时,我可以看到输出包括return404
和xxxxx
。我不明白,如果函数已经在返回中止(404,“未找到记录”)中返回,为什么要打印xxxxx
。在其他语言中,如java、javascript
,如果函数返回一个值,则除了finally
块之外,其余代码不应执行。但是打印('xxxxx')
在finally
块之外。为什么要执行它?中止(404,'Not find record')
引发一个HTTPException
,该异常被块捕获
因此,return abort(404,'Not find record')
语句的return
部分永远不会到达,python将执行except
块,然后执行finally
块,然后执行try except finally
语句之后的语句,而不是返回
然后函数也不会返回,因为
return abort(400, 'failed to delete contact ' + contact_id)
引发另一个HTTPException
,该异常将通过调用堆栈传播
return
s不执行任何操作
如果要传播HTTPException
,但不传播其他异常,可以执行以下操作:
try:
...
except HTTPException:
raise
except Exception as error:
print(error)
finally:
...
...
这将引发abort
引发的HTTPException
s,但在第二个块中处理除
之外的所有其他异常,然后继续该功能。“执行此代码时”-您如何执行代码?我无法重现此操作。如果中止(404,'Not find record')
引发异常,则函数的其余部分将继续,因为except块仅打印异常。在这种情况下,您将得到“return 404”,后面是正在打印的异常,后面是“xxxxx”@IainShelvington。代码不仅调用abort()
,还返回它。在这种情况下,try/except还会捕获它吗?是的,abort
函数引发的任何异常都将被代码中的catch all exception语句“捕获”,即使它是return语句的一部分。它返回调用abort()
的值;如果abort()
在执行过程中引发异常,将无法返回返回值。您有什么建议来解决此问题?我是否必须在块中添加中止(错误)
?