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编写的[打豆豆]小游戏
Jan 08 Javascript
JQuery触发事件例如click
Sep 11 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
Jun 26 Javascript
基于javascript实现彩票随机数生成(升级版)
Apr 17 Javascript
JS 在数组指定位置插入/删除数据的方法
Jan 12 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
Mar 02 Javascript
js实现返回顶部效果
Mar 10 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
Feb 09 Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 Javascript
JavaScript单线程和任务队列原理解析
Feb 04 Javascript
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 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
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python datetime包函数简单介绍
2019/08/28 Python
python属于解释型语言么
2020/06/15 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
python3 re返回形式总结
2020/11/20 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
C#笔试题
2015/07/14 面试题
七一表彰活动方案
2014/01/18 职场文书
小区门卫管理制度
2014/01/29 职场文书
酒店经理职责
2014/01/30 职场文书
质量负责人任命书
2014/06/06 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
欠条格式范本
2015/07/03 职场文书
高温慰问简报
2015/07/21 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android