首页 > 解决方案 > Python 3 异常转换和重新引发

问题描述

我有以下问题:我的应用程序是 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")

{"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)别的东西?

谢谢尼克

标签: python-3.xpython-2.7exceptiondesign-patterns

解决方案


推荐阅读