如何构建自定义Error对象而非字符串,实现API错误消息标准化?
如何构建自定义Error对象而非传入字符串?
你希望在catch块中抛出包含status和message的结构化错误对象,以此统一不同API的错误格式对吧?这里有两种可行的实现方式,推荐你优先选择第一种:
一、自定义继承自Error的类(最佳实践)
这种方式能保留原生Error的所有特性(比如调用栈跟踪),同时让你清晰地标识错误类型,后续处理错误时也更方便区分。
代码示例:
class ApiError extends Error { constructor(status, message) { super(message); // 调用原生Error的构造函数,设置错误消息 this.name = 'ApiError'; // 自定义错误名称,方便识别错误类型 this.status = status; // 添加你需要的自定义状态码属性 // 确保调用栈跟踪的正确性(部分JS环境需要手动处理) if (Error.captureStackTrace) { Error.captureStackTrace(this, ApiError); } } } async function getUrl() { try { const res = await axios.get('https://httpstat.us/500'); } catch(e) { const errorObj = { status: 500, message: 'Internal server error, something is not defined etc' }; // 抛出自定义的ApiError实例 throw new ApiError(errorObj.status, errorObj.message); } } // 后续处理错误的示例 try { await getUrl(); } catch(err) { if (err instanceof ApiError) { console.log(`API错误:状态码${err.status},消息:${err.message}`); } else { // 处理其他类型的非API错误 console.error('未知错误:', err); } }
二、给原生Error实例添加自定义属性(不推荐)
如果你暂时不想自定义类,也可以直接给原生Error实例附加属性,但这种方式不够规范,无法通过instanceof精准区分错误类型,在一些严格环境中可能出现兼容性问题:
async function getUrl() { try { const res = await axios.get('https://httpstat.us/500'); } catch(e) { const errorObj = { status: 500, message: 'Internal server error, something is not defined etc' }; const err = new Error(errorObj.message); // 给原生Error实例添加自定义属性 err.status = errorObj.status; throw err; } } // 处理错误的示例 try { await getUrl(); } catch(err) { if (err.status) { // 只能通过是否存在status属性来判断 console.log(`API错误:状态码${err.status},消息:${err.message}`); } else { console.error('其他错误:', err); } }
总结
- 强烈推荐使用自定义Error类的方式,它更符合JavaScript错误处理的最佳实践,代码的可维护性和扩展性更强。
- 不要尝试修改原生Error类的原型,这会污染全局环境,引发不可预见的问题。
内容的提问来源于stack exchange,提问作者user9728810
相关产品推荐
相关产品推荐

