You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重新实现mapping_code以将自定义错误映射到HTTP状态码

解决方案

改用Map存储错误映射

普通JS对象的键只能是字符串或Symbol,无法直接用构造函数(Function类型)作为键,而Map支持任意类型的键,刚好适配你的需求。

// 定义错误构造函数与HTTP状态码的映射Map
const mapping_code = new Map<Function, number>([
  [CustomError1, HttpStatus.NOT_FOUND],
  [CustomError2, HttpStatus.BAD_REQUEST],
  // 可继续添加更多自定义错误与状态码的映射
]);

修正ErrorHandler逻辑

通过error.constructor获取错误实例的构造函数,直接在Map中查找对应的状态码,同时处理未匹配到的默认情况:

export class ErrorHandler extends HttpException {
  constructor(error: Error, code?: number) {
    // 优先级:映射表匹配的状态码 > 传入的code > 默认500
    const statusCode = mapping_code.get(error.constructor) ?? code ?? HttpStatus.INTERNAL_SERVER_ERROR;
    super(error.message, statusCode);
  }
}

确保自定义错误的constructor正确

如果你的自定义错误是手动继承Error的,需要保证构造函数的指向正确(TypeScript编译后通常会自动处理,但手动写JS时要注意):

class CustomError1 extends Error {
  constructor(message: string) {
    super(message);
    // 可选:手动指定name,不影响constructor的判断,但便于日志排查
    this.name = CustomError1.name;
  }
}

扩展:处理错误继承场景

如果需要支持子类错误匹配父类的状态码(比如CustomSubError extends CustomError1),可以遍历Map查找第一个匹配error instanceof Constructor的项:

export class ErrorHandler extends HttpException {
  constructor(error: Error, code?: number) {
    let statusCode = code ?? HttpStatus.INTERNAL_SERVER_ERROR;
    // 遍历Map,找到第一个匹配的父类/自身构造函数
    for (const [constructor, code] of mapping_code) {
      if (error instanceof constructor) {
        statusCode = code;
        break;
      }
    }
    super(error.message, statusCode);
  }
}

内容的提问来源于stack exchange,提问作者pawcio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:06:20