是返回类似下面的业务错误码结构,

```json
{
    "rc": 10001,
    "msg": "部分商品没有库存",
    "data": {
        "out_of_stock_ids": [
            1,
            2,
            3
        ]
    }
}
```

还是抛出下面这样的自定义异常?
```python3
class BaseBusinessError(Exception):
    rc = 500
    msg = 'Unknown error'
    data = None

    def __repr__(self):
        return f'<Error {self.rc}: {self.msg}. data: {self.data}>'

    def __str__(self):
        return self.__repr__()


class ShopOutOfStockError(BaseBusinessError):
    rc = 10001
    msg = "部分商品没有库存"
    data = None

    def __init__(self, product_ids: list):
        self.data = product_ids

```

如果采用异常方案,调用方没有自定义异常类的定义怎么办?如何反序列化?是不是要共享异常的定义代码给所有调用方?要是调用方是其它语言呢?


[这篇博客]( https://www.cnblogs.com/luozhiyun/p/10251585.html) 下的这句:

> 查询方法不建议抛出 checked 异常,否则调用方在查询时将过多的 try...catch ,并且不能进行有效处理。

中的 checked 异常是什么意思?是否可以理解为查询方法不抛异常。比如,查询某个数据没有权限,直接返回空,而不是抛一个没有权限的异常。
举报· 114 次点击
登录 注册 站外分享
2 条回复  
timethinker 小成 2024-7-2 19:27:38
在 Java 中,受检(checked)异常指的是必须要用 try..catch 来调用一个可能会抛出受检异常的方法。python 中应该所有的都是非受检异常,也就是不强迫你使用 try..catch 。

言归正传,不要把异常跟传输搞混了,RPC 本质上也是通过网络传递数据,至于怎么处理这个数据,你可以参考一下 HTTP 协议,返回不同的状态码来表示协议级别的成功与否。或者不需要状态码,不管成功与否永远返回一个就像你发的那样的数据结构,然后再进一步根据数据里面的 code 再决定是否要抛出异常。
返回顶部