Flask: 自定义错误处理导致TypeError: isinstance()第二个参数错误

1 投票
1 回答
1432 浏览
提问于 2025-04-19 08:55

我在使用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

1 个回答

0

这个异常提示你传给 @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

请仔细检查你传入的对象,确保它是正确的。

撰写回答