js的Error除了message带其他自定义参数怎么设置?

作者站长头像
站长
· 阅读数 6
throw new Error('message')

还可能要带code,reason等字段,要怎么传过去。

回复
1个回答
avatar
test
2024-07-01

继承

Error本身就是一个类先说下其他方案的问题:

  1. 用字符串拼接 new Error("xxxx" + "" + "") 可想而知局限性太大
  2. throw {} 抛出一个对象,没有堆栈

既有堆栈又有各种灵活性,就是自己继承一个自定义Error

class MyError extends Error{
    constructor(message, data) {
        super(message)
        this.data = data
    }
}

// 同步
try {
  throw new MyError('xx报错了', { age: 12, name: '张三' })
}catch(e) {
    e.message // xx报错了
    e.data // { age: 12, name: '张三' }
    e.stack // .....堆栈
}

// 异步
new Promise((resolve, reject) => {
    reject(new MyError('xx报错了', { age: 12, name: '张三' }))
}).catch(e => {
    e.message // xx报错了
    e.data // { age: 12, name: '张三' }
    e.stack // .....堆栈
})

题主就可以new MyError('xxx错误', {code,reason}),获取err.data.code,err.data.reason

上面是公用代码,题主可以按照自己需求封装比如接受多个参数 new MyError('xxx错误', code, reason)

还有一种Error 不就是对象吗,直接加属性就行了:


throw wrapError('xxxxx', code, reason)

function wrapError(message, code, reason){
    const err = new Error('message')
    err.code = code
    err.reason = reason
    return err
}

完整的ts代码:实测在一些babel转换中es6的class会被转成es5,在继承Error的时候会丢失一些属性,就不能只是简单的上面那种几行代码继承,加了一些修复的属性丢失的代码:

class MyError<T> extends Error {
  data: T
  constructor(message: string, data?: T) {
    super(message)
    // 某些经过es6转es5会导致属性丢失
    Object.defineProperty(this, 'message', {
      configurable: true,
      enumerable: false,
      value: message,
      writable: true
    })

    Object.defineProperty(this, 'name', {
      configurable: true,
      enumerable: false,
      value: this.constructor.name,
      writable: true
    })

    this.data = data as any

    if (Object.prototype.hasOwnProperty.call(Error, 'captureStackTrace')) {
      Error.captureStackTrace(this, this.constructor)
    } else {
      Object.defineProperty(this, 'stack', {
        configurable: true,
        enumerable: false,
        value: new Error(message).stack,
        writable: true
      })
    }
  }
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容