如何在一个地方处理多个端点的所有异常?

时间:2017-09-22 08:38:02

标签: python rest exception dry

我使用pynic框架来处理我的API端点,但我想这与Flask或Django的逻辑相同。

我有几个端点,我想知道是否还有在同一个地方处理所有异常。

例如:

class Pnorm(Handler):
    def post(self):

        logger = logging.getLogger(constants.loggerName)
        template_exception = "Exception {0} in class {1} ({2})."

        try:
            myJson = DoThings()
            return myJson

        except HTTP_400 as e:
            logger.critical(message)
            raise e
        except Exception as e:
            # unknown exception raise 500
            logger.critical(message)
            raise HTTP_500(message)

无论如何,我可以让我的所有端点以相同的方式处理异常,或者我是否需要重复我的"异常块"在每一点结束? (我不是仅仅在同一个班级,而是通过该项目。)

干杯, 于连

编辑: 我的主要课程:

class app(WSGI):
    DataStructureHelper.set_dsh()
    setup_logging.setup_logging(logger_name=constants.loggerName, console_level=logging.INFO)

    routes = [
        ('/allocator', Allocator()),
        ('/data/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)', InstrumentData()),
        ('/pnorm', Pnorm()),
        ('/portfolios')
    ]

2 个答案:

答案 0 :(得分:1)

我认为正确的方法是装饰者,因为它完全符合需求。以下是工作代码w.r.t flask。

需要注意的是,您需要将控件从装饰器返回给处理程序。

from functools import wraps
from flask import Flask, request

app = Flask(__name__)
def http_error_codes(method_name):
    @wraps(method_name)
    def handle_exceptions(*args):
        try:
            print("Inside the exceptions")
            return method_name(*args)
        except Exception as e:
            print("HAHAHAHA")
            raise e
    return handle_exceptions

def do_the_login():
    return "Testing is fun"

def show_the_login_form():
    raise ValueError('The day is too frabjous.')

@app.route('/login', methods=['GET', 'POST'])
@http_error_codes
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()


if __name__ == '__main__':
    app.run()

希望这有帮助

答案 1 :(得分:0)

如果您想在一个地方处理所有异常,您可以保留一般的例外区块,如下所示。

MultiPart

这里的异常是General类,它将处理所有异常而不管错误。