У меня следующая проблема: мое приложение является мостом между 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) что-то еще?
Спасибо, Ник