python函数return语句如何工作?

时间:2019-08-26 03:59:25

标签: 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(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 404xxxxx。我不明白如果函数已经返回xxxxx,为什么会打印return abort(404, 'Not find record')。在类似java, javascript的其他语言中,如果函数返回一个值,则除finally块外,其余代码不应执行。但是print('xxxxx')finally块之外。为什么执行?

1 个答案:

答案 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块中处理所有其他异常,然后继续执行该功能。