Python 3.x Python3异常转换和重新引发

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} 问题是我想更好地处理这些异常,并且我只能使用错误消息来区分它们:

我有以下问题: 我的应用程序是dbus和json rpc之间的桥梁。 我有一个dbus库,在dbus异常引发

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)