hobbit_core.err_handler 源代码

import logging

from sqlalchemy.orm import exc as orm_exc

from .response import Result, ServerErrorResult, gen_response, RESP_MSGS

logger = logging.getLogger(__name__)


[文档]class ErrHandler(object): """Base error handler that catch all exceptions. Be sure response is:: { "code": "404", # error code, default is http status code, \ you can change it "message": "Not found", # for alert in web page "detail": "id number field length must be 18", # for debug } Examples:: app.register_error_handler(Exception, ErrHandler.handler) """ @classmethod def handler_werkzeug_exceptions(cls, e): return Result(gen_response( e.code, RESP_MSGS.get(e.code, e.name), None if not hasattr(e, 'data') else e.data['messages']), status=e.code) @classmethod def handler_sqlalchemy_orm_exc(cls, e): code, message, detail = 500, RESP_MSGS[500], repr(e) if isinstance(e, orm_exc.NoResultFound): code, message, detail = 404, u'源数据未找到', repr(e) return Result(gen_response(code, message, detail), status=code) @classmethod def handler_assertion_error(cls, e): code, message, detail = 422, str(e), repr(e) return Result(gen_response(code, message, detail), status=code) @classmethod def handler_others(cls, e): logging.error('UncheckedException:', exc_info=1) return ServerErrorResult(code=500, detail=repr(e)) @classmethod def handler(cls, e): exc = 'others' if hasattr(e, '__module__'): exc = e.__module__.replace('.', '_') elif isinstance(e, AssertionError): exc = 'assertion_error' return getattr(cls, 'handler_{}'.format(exc), cls.handler_others)(e)