python函数return语句是如何工作的?

2024-10-02 02:34:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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。我不明白如果函数已经返回了return abort(404, 'Not find record'),为什么xxxxx会被打印出来。在java, javascript等其他语言中,如果函数返回值,则除了finally块之外,其余代码不应执行。但是print('xxxxx')finally块之外。为什么要执行?你知道吗


Tags: 函数语言idreturnsessioncountcontactjava
1条回答
网友
1楼 · 发布于 2024-10-02 02:34:51

abort(404, 'Not find record')引发一个HTTPException,它被except块捕获。你知道吗

因此return abort(404, 'Not find record')语句的return部分永远不会到达,python将执行except块,然后执行finally块,然后执行try-except-finally语句,而不是返回。你知道吗

然后函数也不会返回,因为

return abort(400, 'failed to delete contact ' + contact_id)

引发另一个HTTPException,它将通过调用堆栈传播。你知道吗

他们什么也不做。你知道吗

如果要传播HTTPException,但不传播其他异常,可以执行以下操作:

try:
    ...
except HTTPException:
    raise
except Exception as error:
    print(error)
finally:
    ...
...

这将引发abort抛出的HTTPException,但会处理第二个except块中的所有其他异常,然后继续该函数。你知道吗

相关问题 更多 >

    热门问题