Angular全局错误处理器打印error.message输出完整错误的问题
搞定Angular全局错误处理器的包装问题
嘿,我懂你现在的困惑——明明抛出的是HTTP错误,可全局处理器里拿到的却是个带promise和rejection属性的包装对象,想要的状态码还藏在error.rejection.headers.status里对吧?
这其实是Angular处理Promise错误的默认行为:当你在Promise回调里抛出错误时,Angular会把原始错误包装成一个带上下文信息的对象,目的是帮你更好追踪错误来源,但确实给我们直接获取原始错误添了点小麻烦。
下面给你两种实用的解决思路,按需选择就行:
方法一:在全局处理器中提取原始错误
直接修改你的GlobalErrorHandlerService,先判断错误是否被包装,再把真正的错误对象捞出来:
@Injectable() export class GlobalErrorHandlerService implements ErrorHandler { constructor() { console.log('error handler constructor'); } handleError(error: any) { // 提取真实错误:如果有rejection属性就用它,没有则用原error const realError = error.rejection ?? error; // 现在就能拿到你需要的内容了 console.log('错误消息:', realError.message); console.log('状态码:', realError.headers?.status); // 这里还可以扩展更多逻辑,比如错误上报、用户提示等 } }
方法二:直接在API回调中处理(跳过全局抛出)
如果你不想让Angular包装错误,也可以在sending方法的错误回调里直接调用全局处理器,而非抛出错误:
// 记得先注入全局错误处理器 constructor(private errorHandler: GlobalErrorHandlerService) {} private sending(data) { this.myApi.send({ type: 'json', data: data }).then(response => { this.onChange.next(response); }, httpError => { // 直接把原始HTTP错误交给全局处理器处理 this.errorHandler.handleError(httpError); }); }
不过更推荐第一种方法,毕竟全局错误处理器的核心价值就是统一捕获所有未处理错误,能保持代码的一致性。
内容的提问来源于stack exchange,提问作者JohnnyK
相关产品推荐
相关产品推荐

