2016-07-29 4 views
3

Как можно обрабатывать исключения во всем мире с помощью Flask? Я нашел способы использовать следующие для обработки пользовательского БД взаимодействий:Обработка глобальных исключений Flask

try: 
    sess.add(cat2) 
    sess.commit() 
except sqlalchemy.exc.IntegrityError, exc: 
    reason = exc.message 
    if reason.endswith('is not unique'): 
     print "%s already exists" % exc.params[0] 
     sess.rollback() 

Проблемы с try - except, я должен был бы работать, что каждый аспект моего кода. Я могу найти лучшие способы сделать это для пользовательского кода. Мой вопрос направлен больше к глобальной ловле и обработок для:

apimanager.create_api(
    Model, 
    collection_name="models", 
    **base_writable_api_settings 
) 

Я обнаружил, что это apimanager принимает validation_exceptions: [ValidationError], но я не нашел примеры этого используются.

Я по-прежнему хотел бы получить более высокий уровень обработки, который будет влиять на все взаимодействия db с простой концепцией «Если эта ошибка: показать это, если другая ошибка: показать что-то еще», которая просто выполняется во всех взаимодействиях/исключениях автоматически без меня включая его на каждом apimanager (поместить его в мой base_writable_api_settings в порядке, я думаю). (IntegrityError, NameError, DataError, DatabaseError и т.д.)

ответ

1

Я, как правило, чтобы настроить обработчик ошибок на приложение, которое форматирует исключение в ответ JSON. После этого вы можете создавать собственные исключения, как UnauthorizedException ...

class Unauthorized(Exception): 
    status_code = 401 

@app.errorhandler(Exception) 
def _(error): 

    trace = traceback.format_exc() 
    status_code = getattr(error, 'status_code', 400) 
    response_dict = dict(getattr(error, 'payload', None) or()) 
    response_dict['message'] = getattr(error, 'message', None) 
    response_dict['traceback'] = trace 

    response = jsonify(response_dict) 
    response.status_code = status_code 
    traceback.print_exc(file=sys.stdout) 
    return response 

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

@app.errorhandler(ValidationError) 
def handle_validation_error(error): 
    # Do something... 

обработчиков ошибок привязываться к приложению, а не apimanager , У вас, вероятно, есть что-то вроде

Поместите это где-нибудь, используя этот объект приложения.

+0

[Здесь] (http://flask.pocoo.org/docs/0.11/api/#flask.Flask.errorhandler) - соответствующая документация! –

+0

Не мог бы вы сказать мне, как подключить к этому: apimanager.create_api ( модели, COLLECTION_NAME = «модель», ** base_writable_api_settings) В настоящее время моя цель состоит в том, чтобы получить специальное сообщение для: IntegrityError. Это относится ко всем api_managers. 'код base_api_settings = { "exclude_columns": [ 'пароль', 'user.password', 'группы', 'registration_token',«пользователь.registration_token '], "max_results_per_page": 100, "validation_exceptions": [ValidationError] } ' – draxous

+0

Я пробовал это несколько разных способов. Каждый раз, когда я представить дубликат записи я получаю стандарт: { «сообщение»: «IntegrityError» } Вот Pastebin: http://pastebin.com/7Asb08kE – draxous

0

Мой предпочтительный подход использует функции decorated view-functions.

Вы можете определить декоратор, как следующее:

def handle_exceptions(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
    try: 
     return func(*args, **kwargs) 
    except ValidationError: 
     # do something 
    except HTTPException: 
     # do something else ... 
    except MyCustomException: 
     # do a third thing 

Тогда вы можете просто украсить вид-функцию, например,

@app.route('/') 
@handle_exceptions 
def index(): 
    # ... 

К сожалению, я не знаю о крючках. Фляга-Беспокойные предложения для передачи функций просмотра.

Смежные вопросы