如何方便地定义与捕获业务异常。

2020-12-07 15:42:56 +08:00
 golangLover

大家好。我是新手请大家多多赐教, 我现在有一堆错误编号(error code)和相对应的中文解释。大概就是

{
errorCode:A10,
description: "输入校验错误"
}

服务层可能会抛出上面那样的自定义异常。我在 controller 层 try-catch 服务层抛出的自定义异常,然后返回上面那样的回应给前端。问题是当中并不完全是由我自己抛出的异常,还有涉及是操作数据库之类的 sequelize 异常,或一些其他库自定义的异常。所以我不可以把那个异常直接返回前端,那应该怎么办,是不是在不同的层不断地 try-catch 转换成既定格式。但如果我逐个捕获的话,可能需要大量的 try-catch 代码.而且我不太清楚如何储存上述的异常编号与其中文解释。谢谢大家。

2776 次点击
所在节点    Node.js
11 条回复
MinQ
2020-12-07 17:10:43 +08:00
业务异常定义成 ServiceException,然后在最外面统一处理。异常编号与中文解释存一个 redis,用到的时候去查一下
saulshao
2020-12-07 17:23:38 +08:00
你如果是前端,那就自己定义一套异常,这些异常通常只作用于前端代码,所有不需要与后端交互的异常都应该在你的这一套异常里头。
但是通常这不是你自己说了算的,你需要把这套东西拿出去给你的开发组长和后端一起审核,确保大家的意见一致。
控制层也是这么操作。
至于异常定义就参考一楼的观点就行。
至于不属于你的范围的异常,那当然是直接丢出去显示;或者跟后端达成协议,抛一个统一的异常信息给用户(例如 502),然后将详细的异常记录到日志里,方便后期调试(通常这不由前端和 controller 层处理)。这些异常信息记录能力还可以不用部署到生产环境,根据环境确定要不要写异常。
有的时候,异常还是安全敏感的,但是这通常不由前端和控制层程序员考虑。
MinQ
2020-12-07 17:29:19 +08:00
刚看到是 node.js ,有点尴尬
ChevalierLxc
2020-12-07 17:46:19 +08:00
@MinQ 实现思路一样啊,不同语言有区别吗?
MinQ
2020-12-07 17:53:48 +08:00
@ChevalierLxc 理是这个理,我这不是当成 Java 说了个 ServiceException 么
golangLover
2020-12-07 20:37:12 +08:00
@saulshao 谢谢你的看法。但是我是后端。。。。
ychost
2020-12-07 20:41:54 +08:00
前端一般都只包含一个 code 然后提示网络错误,出问题去服务端去查就行了
ychost
2020-12-07 20:42:23 +08:00
你这个没必须在 controller 内部 try catch,spring 可以抓全局的异常,根据 instance of 去构造返回就行了
ychost
2020-12-07 20:43:10 +08:00
@ychost 看错了,node 也一样可以全局抓
IvanLi127
2020-12-08 12:37:11 +08:00
一般框架都能全局拦截响应,拦下来处理呗?
KouShuiYu
2020-12-16 14:12:27 +08:00
我是这么做的
自定义一个异常
```js
class CustomError extends Error {
constructor({ code, msg }, message) {
super(message || msg);
this.code = code;
this.msg = message || msg;
}
}

module.exports = CustomError;

```

拦截异常
```

const CustomError = require('../utils/customError');

/**
*拦截自定义异常统一处理
*/
const errorhandler = () => async (ctx, next) => {
try {
await next();
} catch (error) {
ctx.logger.error(error);
if (error instanceof CustomError) {
return ctx.error(error, error.message);
}
return ctx.error();
}
};

module.exports = errorhandler;

``

然后抛出异常就行了
```
throw new CustomError(ERROR.ALREADY_EXIT, `advertiser ${name} already exit`);
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/732974

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX