【问题标题】:python2 vs. python3 raise statementpython2 vs. python3 raise 语句
【发布时间】:2018-01-06 09:00:30
【问题描述】:

在烧瓶文档中有一个钩子函数的示例,当没有找到烧瓶定义的 url 端点时,它允许通过调用为 url_for 函数添加自定义行为。如果没有匹配的用户定义的 url 端点,程序员可以添加自定义端点或重新引发异常(使用原始上下文)。

def external_url_handler(error, endpoint, values):
    "Looks up an external URL when `url_for` cannot build a URL."
    # This is an example of hooking the build_error_handler.
    # Here, lookup_url is some utility function you've built
    # which looks up the endpoint in some external URL registry.
    url = lookup_url(endpoint, **values)
    if url is None:
        # External lookup did not have a URL.
        # Re-raise the BuildError, in context of original traceback.
        exc_type, exc_value, tb = sys.exc_info()
        if exc_value is error:
            raise exc_type, exc_value, tb
        else:
            raise error
    # url_for will use this result, instead of raising BuildError.
    return url

app.url_build_error_handlers.append(external_url_handler)

此代码 sn-p 似乎是 python2 代码,并且由于 raise exc_type, exc_value, tb 行而对 python3 失败。 python2python3 文档列出了 raise 语句的不同参数。

把这个sn-p转换成python3的正确方法是什么?

【问题讨论】:

  • 等效的Py3代码是raise exc_type(exc_value).with_traceback(tb)

标签: python python-3.x exception flask raise


【解决方案1】:

这是在the raise statement 的文档中指定的:

您可以使用with_traceback() 异常方法(该方法返回相同的异常实例,并将其回溯设置为其参数)在一个步骤中创建一个异常并设置您自己的回溯,如下所示:

raise Exception("foo occurred").with_traceback(tracebackobj)

所以,在你的情况下,那将是:

raise exc_type(exc_value).with_traceback(tb) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2016-03-26
    • 2021-04-09
    相关资源
    最近更新 更多