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()
在执行过程中引发异常,将无法返回
返回值。您有什么建议来解决此问题?我是否必须在
块中添加
中止(错误)