Angular处理未可知异常错误的方法详解


Posted in Javascript onJanuary 17, 2021

写在前面

代码写得再好,始终都无法完整的处理所有可能产生异常,特别是生产环境中的应用,很大一部分是数据来自用户、远程,很难保证所有数据都按程序规定的产生。事实上,除非测试人员发现或者客户报告,否则都无法得知。因此,将应用产生的未可知异常进而上报是非常重要的环节。

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 方法并重新处理异常消息即可。

ErrorHandler

首先创建一个 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处理未可知异常错误内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript与CSS复习(二)
Jun 29 Javascript
Jquery下判断Id是否存在的代码
Jan 06 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
js绑定事件this指向发生改变的问题解决方法
Apr 23 Javascript
Angularjs---项目搭建图文教程
Jul 08 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
Dec 14 Javascript
完美解决JS文件页面加载时的阻塞问题
Dec 18 Javascript
ES6中新增的Object.assign()方法详解
Sep 22 Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 Javascript
ES6基础之解构赋值(destructuring assignment)
Feb 21 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
JavaScript实现4位随机验证码的生成
Jan 28 Javascript
react-native 实现购物车滑动删除效果的示例代码
Jan 15 #Javascript
vue element el-transfer增加拖拽功能
Jan 15 #Vue.js
关于uniApp editor微信滑动问题
Jan 15 #Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 #Javascript
详解node.js创建一个web服务器(Server)的详细步骤
Jan 15 #Javascript
JavaScript中展开运算符及应用的实例代码
Jan 14 #Javascript
js中延迟加载和预加载的具体使用
Jan 14 #Javascript
You might like
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
JavaScript 继承详解(一)
2009/07/13 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
浅析Python 中整型对象存储的位置
2016/05/16 Python
python实现抖音点赞功能
2019/04/07 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
关于python中导入文件到list的问题
2020/10/31 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
综合测评自我鉴定
2013/10/08 职场文书
促销活动方案模板
2014/02/24 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
银行实习推荐信
2015/03/27 职场文书
建党伟业电影观后感
2015/06/01 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python