V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
golangLover
V2EX  ›  Node.js

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

  •  
  •   golangLover · Dec 7, 2020 · 3260 views
    This topic created in 1967 days ago, the information mentioned may be changed or developed.

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

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

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

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