Python 3 исключения преобразования и повторного повышения - PullRequest
2 голосов
/ 28 января 2020

У меня следующая проблема: мое приложение является мостом между dbus и json -rp c. У меня есть библиотека dbus, которая в случае исключения Dbus вызывает

DBusException("my err msg") exception.

Моя библиотека json -rp c перехватывает все исключения и преобразует их в хорошую общую ошибку сервера c сообщение

{"jsonrpc": "2.0", "error": {"code": -32000, "message": "Server error"}, "id": 2}

Проблема в том, что я хочу лучше обработать эти исключения, и я могу различить guish между ними только с помощью сообщения об ошибке: например, мне нужно преобразовать

DBusException("Invalid Parameters")

до

{"jsonrpc": "2.0", "error": {"code": -32001, "message": "Server error", data="Invalid Parameters" }, "id": 2}

, что можно сделать, вызвав в моей библиотеке исключение ApiError (msg, code, data).

Подводя итог: - Мне нужно отловить исключение DBusException - на основании err_msg мне нужно переключаться между различными типами исключений и повторно вызывать модифицированное исключение ApiError

Как лучше к этому подойти? это должно быть сделано как минимум в 10 функциях с одинаковыми исключениями.

1) с использованием декоратора?

def my_exception_catcher(fun, *args, **kwargv):
    try:
        fun(args, *argv)
    except DBusException as e
        err_msg = str(e)
        if err_msg == "Invalid Arguments":
            raise ApiError("Server Error", code=1, data=err_msg)
        else if err_msg == "Connect Error":
            raise ApiError("Server Error", code=2, data=err_msg)
        else:
            raise

@my_exception_catcher
my_fun(*args):
    do_something

2) с использованием функции для определения типа исключения?

def find_my_dbus_error(err_msg):
    if err_msg == "Invalid Arguments":
        return ApiError("Server Error", code=1, data=err_msg)
    else if err_msg == "Connect Error":
        return ApiError("Server Error", code=2, data=err_msg)
    else:
        return Exception(err_msg)

try:
    my_fun(params)
except DBusException as e
    raise find_my_dbus_error(err_msg)

3) что-то еще?

Спасибо, Ник

...