时间:2021-05-28
代码写得再好,始终都无法完整的处理所有可能产生异常,特别是生产环境中的应用,很大一部分是数据来自用户、远程,很难保证所有数据都按程序规定的产生。事实上,除非测试人员发现或者客户报告,否则都无法得知。因此,将应用产生的未可知异常进而上报是非常重要的环节。
Angular 默认情况下也提供了全局的异常管理,当发生异常时,会把它扔到 Console 控制台上。如果你在使用NG-ZORRO 时,可能经常就会遇到 ICON 未加载的异常消息,这也是异常消息的一种:
core.js:5980 ERROR Error: [@ant-design/icons-angular]:the icon setting-o does not exist or is not registered. at IconNotFoundError (ant-design-icons-angular.js:94) at MapSubscriber.project (ant-design-icons-angular.js:222) at MapSubscriber._next (map.js:29) at MapSubscriber.next (Subscriber.js:49) at RefCountSubscriber._next (Subscriber.js:72) at RefCountSubscriber.next (Subscriber.js:49) at Subject.next (Subject.js:39) at ConnectableSubscriber._next (Subscriber.js:72) at ConnectableSubscriber.next (Subscriber.js:49) at CatchSubscriber.notifyNext (innerSubscribe.js:42)而 Angular 是通过ErrorHandler 统一管理异常消息,而且只需要覆盖其中的handleError 方法并重新处理异常消息即可。
首先创建一个custom-error-handler.ts 文件:
import { ErrorHandler, Injectable } from '@angular/core';@Injectable()export class CustomErrorHandler extends ErrorHandler { handleError(error: any): void { super.handleError(error); }}CustomErrorHandler 可以完整的获取当前用户数据、当前异常消息对象等,并允许通过HttpClient 上报给后端。
以下是NG-ALAIN 的文档站,由于是使用 Google Analytics 来分析,只需要将异常消息转给onerror 即可:
import { DOCUMENT } from '@angular/common';import { ErrorHandler, Inject, Injectable } from '@angular/core';@Injectable()export class CustomErrorHandler extends ErrorHandler { constructor(@Inject(DOCUMENT) private doc: any) { super(); } handleError(error: any): void { try { super.handleError(error); } catch (e) { this.reportError(e); } this.reportError(error); } private reportError(error: string | Error): void { const win = this.doc.defaultView as any; if (win && win.onerror) { if (typeof error === 'string') { win.onerror(error); } else { win.onerror(error.message, undefined, undefined, undefined, error); } } }}最后,在AppModule 模块内注册CustomErrorHandler :
@NgModule({ providers: [ { provide: ErrorHandler, useClass: CustomErrorHandler }, ]})export class AppModule { }事实上还有一项非常重要的工作,生产环境中都是打包压缩过后的,换言之所产生的异常消息也是无法与实际代码行数相同的数字,这就需要 SourceMap 的支持,当然正常的生产环境是不会发布这份文件的,所以如果想要得到正确的行列数,还是需要借助一层中间层,在后端利用source-map 模块来解析出真正的行列数值。
Angular 的依赖注入(DI)系统可以使我们快速替换一些 Angular 内置模块,从而实现在不修改业务层面时快速解决一些特殊需求。
到此这篇关于Angular如何处理未可知异常错误的文章就介绍到这了,更多相关Angular处理未可知异常错误内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
以电视为例,截止2020年8月20日,魔力视频打不开了是因为魔力视频已经全面停服,不再提供视频直播服务,停服原因尚未可知。 电视用电的方法即时传送活动的视觉图
2020年来临,电商的跨年促销大战正开始紧急预备,这预示着新一轮的节日电商大战即将来临,谁胜谁负,尚未可知。但很明显,节日促销,是所有电商平台不能输掉的战争。尤
4月8日下午消息,百度副总裁、负责百度移动互联网业务的李明远即将离职,并将出任即将赴美上市的京东的CTO。目前李明远的离职原因尚未可知。也有接近百度的人猜测,李
7月21日消息,据新浪科技报道,日前市场消息称京东科技副总裁谢锦生、程建波先后离职,谢锦生已结束离职流程,但新去处还未可知。程建波将出任朴道征信,任职资格仍有待
异常(Exception)用于在指定的错误发生时改变脚本的正常流程。什么是异常?PHP5提供了一种新的面向对象的错误处理方法。异常处理用于在指定的错误(异常)情