python-3.x - 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)别的东西?
谢谢尼克
解决方案
推荐阅读
- javascript - 在更改窗口大小时调整包含文本的 div
- python - 新选择后在下拉菜单 tkinter 中保留标记
- mongodb - 使用树结构在 MongoDb 中获取祖先
- reactjs - 在 React/Redux 中重新渲染后保持 Scroll-y
- ios - [Firebase/Core][I-COR000003] 尚未配置默认 Firebase 应用
- django - django.core.cache.backends.base.InvalidCacheBackendError:找不到后端“django_redis.cache.RedisCache”:无法导入名称“六”
- go - 为什么`go build` 可以使用“+compatible”依赖,但`go list -m all` 却不行?
- reactjs - 无法在反应中添加图像出现错误错误:使用要求时找不到模块'./undefined'
- angular - ionic:连续打印每张照片
- python - 无法将多个csv文件导入pandas并在Python中连接到一个DataFrame