Python 3.x Python3异常转换和重新引发
我有以下问题: 我的应用程序是dbus和json rpc之间的桥梁。 我有一个dbus库,在dbus异常引发Python 3.x Python3异常转换和重新引发,python-3.x,python-2.7,exception,design-patterns,Python 3.x,Python 2.7,Exception,Design Patterns,我有以下问题: 我的应用程序是dbus和json rpc之间的桥梁。 我有一个dbus库,在dbus异常引发 DBusException("my err msg") exception. 我的json rpc库正在捕获所有异常并将其转换为一条漂亮的通用服务器错误消息 {"jsonrpc": "2.0", "error": {"code": -32000, "message": "Server error"}, "id": 2} 问题是我想更好地处理这些异常,并且我只能使用错误消息来区分它们:
DBusException("my err msg") exception.
我的json rpc库正在捕获所有异常并将其转换为一条漂亮的通用服务器错误消息
{"jsonrpc": "2.0", "error": {"code": -32000, "message": "Server error"}, "id": 2}
问题是我想更好地处理这些异常,并且我只能使用错误消息来区分它们:
例如,我需要转换
DBusException("Invalid Parameters")
到
这可以通过在我的库中引发ApiError(msg、code、data)异常来实现
综上所述:
-我需要捕获一个DBusException
-基于err_msg,我需要在不同的异常类型之间切换,并重新引发一个修改的异常
APIRERROR异常
更好的方法是什么?这需要在至少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) 还有别的吗
谢谢
尼克
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)