1个回答
test
2024-07-01
继承
Error
本身就是一个类先说下其他方案的问题:
- 用字符串拼接 new Error("xxxx" + "" + "") 可想而知局限性太大
- 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
})
}
}
}
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容