【问题标题】:Flask: Custom Error handler resulting in TypeError: isinstance() arg 2Flask:自定义错误处理程序导致 TypeError:isinstance() arg 2
【发布时间】:2014-10-26 13:46:57
【问题描述】:

我在使用 Flask 和创建自定义错误处理程序时遇到问题。我想将我的错误处理卸载到一个单独的类并遵循此处的文档:http://flask.pocoo.org/docs/0.10/patterns/apierrors/

在测试我的新错误处理程序时,会返回以下消息。

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

我相信上述错误消息直接来自 Flask 中的此检查:https://github.com/mitsuhiko/flask/blob/master/flask/app.py#L1407,但我不了解实际问题或如何解决它。

自定义错误类为:

class ErrorHandler(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, payload=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv['message'] = self.message
        return rv

调用这个类的代码是:

@app.errorhandler(ErrorHandler)
def bad_request(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

@app.route('/', methods=['GET', 'POST'])
def testing():
    if request.method == 'GET':
        raise ErrorHandler('test', 400)
    elif request.methods == 'POST':
         pass
    else:
         pass

已解决:

改变了我的进口来源

import ErrorHandler

from ErrorHandler import ErrorHandler

【问题讨论】:

  • 您的异常子类的名称为ErrorHanlder,注意dl 的转置。您在@app.errorhandler() 注册的ErrorHandler 很可能不是 是一个类型,而是完全不同的东西。
  • 糟糕,我会解决这个问题,但我担心这仍然不是问题。
  • 异常是因为你传入@app.errorhandler() 的不是一个类,所以isinstance(thrownexception, ErrorHandler) 失败并出现该错误。
  • 谢谢。应该是从ErrorHandler导入ErrorHandler。
  • 看,这就是为什么 PEP-8 建议您对模块使用小写名称,对类使用驼峰式名称。 :-)

标签: python flask typeerror


【解决方案1】:

异常表明您传递给@app.errorhandler() 装饰器的内容不是类

isinstance() 测试会引发异常(在您的情况下为ErrorHandler('test', 400)),以及您传递给@app.errorhandler() 的任何内容。异常告诉你后一个值不是一个类:

>>> class Foo(Exception): pass
... 
>>> isinstance(Foo(), Foo)
True
>>> isinstance(Foo(), 'something else')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

仔细检查和三重检查你那里有正确的对象。

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 2010-12-26
    • 2019-09-22
    • 2017-12-18
    • 2018-04-29
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多