V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
golangLover
V2EX  ›  Node.js

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

  •  
  •   golangLover · 2020-12-07 15:42:56 +08:00 · 2748 次点击
    这是一个创建于 1449 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    11 条回复    2020-12-16 14:12:27 +08:00
    MinQ
        1
    MinQ  
       2020-12-07 17:10:43 +08:00
    业务异常定义成 ServiceException,然后在最外面统一处理。异常编号与中文解释存一个 redis,用到的时候去查一下
    saulshao
        2
    saulshao  
       2020-12-07 17:23:38 +08:00
    你如果是前端,那就自己定义一套异常,这些异常通常只作用于前端代码,所有不需要与后端交互的异常都应该在你的这一套异常里头。
    但是通常这不是你自己说了算的,你需要把这套东西拿出去给你的开发组长和后端一起审核,确保大家的意见一致。
    控制层也是这么操作。
    至于异常定义就参考一楼的观点就行。
    至于不属于你的范围的异常,那当然是直接丢出去显示;或者跟后端达成协议,抛一个统一的异常信息给用户(例如 502),然后将详细的异常记录到日志里,方便后期调试(通常这不由前端和 controller 层处理)。这些异常信息记录能力还可以不用部署到生产环境,根据环境确定要不要写异常。
    有的时候,异常还是安全敏感的,但是这通常不由前端和控制层程序员考虑。
    MinQ
        3
    MinQ  
       2020-12-07 17:29:19 +08:00
    刚看到是 node.js ,有点尴尬
    ChevalierLxc
        4
    ChevalierLxc  
       2020-12-07 17:46:19 +08:00
    @MinQ 实现思路一样啊,不同语言有区别吗?
    MinQ
        5
    MinQ  
       2020-12-07 17:53:48 +08:00
    @ChevalierLxc 理是这个理,我这不是当成 Java 说了个 ServiceException 么
    golangLover
        6
    golangLover  
    OP
       2020-12-07 20:37:12 +08:00
    @saulshao 谢谢你的看法。但是我是后端。。。。
    ychost
        7
    ychost  
       2020-12-07 20:41:54 +08:00
    前端一般都只包含一个 code 然后提示网络错误,出问题去服务端去查就行了
    ychost
        8
    ychost  
       2020-12-07 20:42:23 +08:00
    你这个没必须在 controller 内部 try catch,spring 可以抓全局的异常,根据 instance of 去构造返回就行了
    ychost
        9
    ychost  
       2020-12-07 20:43:10 +08:00
    @ychost 看错了,node 也一样可以全局抓
    IvanLi127
        10
    IvanLi127  
       2020-12-08 12:37:11 +08:00 via Android
    一般框架都能全局拦截响应,拦下来处理呗?
    KouShuiYu
        11
    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`);
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5642 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:11 · PVG 17:11 · LAX 01:11 · JFK 04:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.