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 相关文章推荐
JS 进度条效果实现代码整理
May 21 Javascript
JS保留两位小数 四舍五入函数的小例子
Nov 20 Javascript
JS获取url链接字符串 location.href
Dec 23 Javascript
js中的preventDefault与stopPropagation详解
Jan 29 Javascript
JavaScript编程中容易出BUG的几点小知识
Jan 31 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
微信小程序 实现tabs选项卡效果实例代码
Oct 31 Javascript
javascript删除html标签函数cIsHTML
Jan 09 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 Javascript
JavaScript实现文件下载并重命名代码实例
Dec 12 Javascript
原生JS利用transform实现banner的无限滚动示例代码
Jun 15 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仿discuz分页效果代码
2008/10/02 PHP
Chrome Web App开发小结
2014/09/04 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
Python操作MongoDB详解及实例
2017/05/18 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
python的socket编程入门
2018/01/29 Python
对于Python深浅拷贝的理解
2019/07/29 Python
Python的垃圾回收机制详解
2019/08/28 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
《雨霖铃》教学反思
2014/02/22 职场文书
八项规定对照检查材料
2014/08/31 职场文书
商业门面租房协议书
2014/11/25 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
2019年教师入党申请书
2019/06/27 职场文书
python实战之用emoji表情生成文字
2021/05/08 Python
Python数据分析之pandas读取数据
2021/06/02 Python