当前位置: 首页 > 知识库问答 >
问题:

如何捕获在装饰程序中引发的错误?

谢麒
2023-03-14

我正在使用flask auth,它提供了一些辅助装饰程序。我已经添加了下面所有的各种方法,但是我想问的问题是如何捕获授权的\u处理程序装饰程序抛出的任何问题。这是一个关于装饰师的一般性问题,但我认为一个真实的例子可能会有所帮助。

如果装修工爆炸了,我怎么能抓住它?

import os
import flask
import flask_oauth

CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']

oauth = flask_oauth.OAuth()
twitter = oauth.remote_app(
    'twitter',
    base_url='https://api.twitter.com/1/',
    request_token_url='https://api.twitter.com/oauth/request_token',
    access_token_url='https://api.twitter.com/oauth/access_token',
    authorize_url='https://api.twitter.com/oauth/authenticate',
    consumer_key=CONSUMER_KEY,
    consumer_secret=CONSUMER_SECRET
)

app = flask.Flask(__name__)

@app.route('/login')
def login():
    return twitter.authorize(
        callback=url_for(
            'oauth_authorized',
            next=request.args.get('next') or request.referrer or None)
    )

@app.route('/oauth-authorized')
# what happens if this raises an error?
@twitter.authorized_handler
def oauth_authorized(resp):
    print 'foo-bar'

共有1个答案

凤柏
2023-03-14

执行函数定义。因此,假设引发的异常特定于该修饰符,您可以将函数定义(包括修饰符)包装在try/except中:

try:
    @app.route('/oauth-authorized')
    @twitter.authorized_handler
    def oauth_authorized(resp):
        print 'foo-bar'
except WhateverError as e:
    print "twitter.authorized_handler raised an error", e

当然,如果引发异常,这将使oauth\u authorized未定义。在您的情况下,这可能是可以的,因为您可能不希望它被路由。但是,如果这不是您想要的,您可以向块中添加一个虚拟定义,但块除外。

或者,因为装饰器只是函数(好吧,任何可调用的),而@符号只是函数调用的语法糖,所以您可以在try/除中包装authorized_handler装饰:

def oauth_authorized(resp):
    print 'foo-bar'
try:    # apply decorator
    oauth_authorized = twitter.authorized_handler(oauth_authorized)
except Exception as e:
    print "twitter.authorized_handler raised an error", e
else:   # no error decorating with authorized_handler, apply app.route
    oauth_authorized = app.route('/oauth-authorized')(oauth_authorized)

如果authorized_handler修饰失败,这将为您留下未修饰版本的函数,但它不会被路由。你甚至可以把上面的功能放在它自己的功能中,并把它作为装饰器使用!

 类似资料:
  • 我正在从可能被压缩的服务器下载内容,所以我使用了我在不同地方找到的样板: 问题是,如果HTTPS请求因网络错误而失败,我有时会引发以下异常: 该“错误”事件处理程序未捕获异常。那么我如何捕获它,以便能够正确地清理文件并知道如何重试?

  • 我有下面的代码,我用它来让一个用户静默登录 如果用户无法静默登录,将会导致错误。 我遇到的问题是,我似乎无法抓住例外。捕获错误或捕获块正在被击中。如何捕获此错误?

  • 我正在实现自定义'AuthenticationProvider'。如果没有经过身份验证,我将在'authenticate'函数中抛出异常,如下所示。 我有全局异常处理程序,如下所示。 当在'authenticate'函数内部引发异常时,不会调用全局异常处理程序。对于所有其他例外情况,它正在被调用。我想在全局异常处理程序中捕获异常并返回自定义错误消息。我怎么能那样做?感谢任何帮助。提前道谢。

  • 问题内容: 我正在使用PHP函数将数据从本地计算机发布到Web服务器。我的代码如下: 不幸的是,我无法捕获任何错误,例如404、500或网络故障。那么,我如何得知数据没有发布到远程或从远程检索呢? 问题答案: 您可以使用该功能检测是否有错误。例如:

  • 问题内容: 我在Python中构建了一个简短的url转换器引擎,并且看到大量的“管道破损”错误,并且很好奇在使用BaseHTTPServer类时如何最好地捕获它。这不是全部代码,但可以让您大致了解我目前正在做什么: 该代码本身运行良好,但是在生产中几乎立即开始引发错误: 这些错误的大部分似乎源于在调用send_header()方法时遇到的问题,其中我要写的是: 所以我很好奇在我的代码中尝试捕获此I

  • 问题内容: 如果Ajax请求失败,我想捕获该错误并显示相应的消息。 我的代码如下所示,但是我无法捕获失败的Ajax请求。 我发现,当Ajax请求失败时,“ Error in Ajax”将永远不会执行。 如何处理Ajax错误并在失败时显示适当的消息? 问题答案: 从jQuery 1.5开始,您可以使用延迟对象机制: 另一种方法是使用: