Errorhandler не вызывается для пользовательских исключений - PullRequest
0 голосов
/ 23 марта 2019

У меня есть следующие обработчики ошибок:

@api.errorhandler(DatabaseException)
    def handle_database_exception(database_error):
        return database_error.query_error, 400


@api.errorhandler(ValidationException)
    def handle_validation_exception(validation_error):
        return {'fields': validation_error.body_error}, 400

Это простые классы:

class ValidationException(Exception):

    def __init__(self, body_error=None, missing_files=None):
        Exception.__init__(self, "Validation failed")
        self.body_error = body_error
        if missing_files is not None:
            for missing_file in missing_files:
                self.body_error[missing_file] = ['required file']

class DatabaseException(Exception):

    def __init__(self, details):
        Exception.__init__(self, "Database Error")
        self.query_error = details

Вот моя проблема: если я вызываю поднять компонент DatabaseException в любом из моих маршрутов, онпроваливается, и я получаю шаблон 500 из колбы.

Действительно забавно то, что реализованное ранее исключение ValidationException прекрасно работает.

Я подробно рассказал о том, что происходит, когдаВозникает ValidationException, он проходит через response.py и попадает в обработчик ошибок.К сожалению, я не могу понять все, что происходит внутри колбы, но в отладке исключение DatabaseException определенно пошло по другому пути.

Я ожидаю, что вызовутся обработчики ошибок.Если я вызову исключение DatabaseException на одном из моих маршрутов, он должен быть вызван.

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Извините, мой ответ был немного странным. Если вы хотите вернуть ответ в формате JSON, вы можете сделать это следующим образом.

class ValidationException(Exception):
    def __init__(self, body_error=None, missing_files=None):
        Exception.__init__(self, "Validation failed")
        self.body_error = body_error
        if missing_files is not None:
            for missing_file in missing_files:
            self.body_error[missing_file] = ['required file']

@api.errorhandler(ValidationException)
def handle_validation_exception(validation_error):
    from flask import jsonify, make_response
    return make_response(jsonify({'fields': validation_error.body_error}), 400)

Этот способ также возможен.

@api.errorhandler(ValidationException)
def handle_validation_exception(validation_error):
    return "{'fields': validation_error.body_error}", 400

DatabaseException работает нормально и возвращает 400 неверных запросов с открытым текстом.

Веселись ^ 2.

1 голос
/ 24 марта 2019

DatabaseException отлично сработало для меня.

Во втором решении вы пытаетесь вернуть словарь Python.Я предполагаю, что пропущенные кавычки вызывают ошибку.Возможно, вы могли бы использовать jsonify и make_response.

@api.errorhandler(DatabaseException)
def handle_validation_exception(validation_error):
    from flask import jsonify, make_response
    return make_response(jsonify({ 'fields': validation_error.query_error }), 400)

Веселитесь!

...