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 相关文章推荐
JQuery 学习笔记 element属性控制
Jul 23 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
Dec 28 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
基于KMP算法JavaScript的实现方法分析
May 03 Javascript
元素绑定click点击事件方法
Jun 08 Javascript
总结jQuery插件开发中的一些要点
May 16 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
Feb 21 Javascript
JavaScript方法_动力节点Java学院整理
Jun 28 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
Feb 13 jQuery
vscode 开发Vue项目的方法步骤
Nov 25 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
Mar 08 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
Jan 18 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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
给Function做的OOP扩展
2009/05/07 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
浅析script标签中的defer与async属性
2016/11/30 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
在Python中进行自动化单元测试的教程
2015/04/15 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
对Django url的几种使用方式详解
2019/08/06 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
函数指针的定义是什么
2016/08/14 面试题
毕业生简单求职信
2013/11/19 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
2014年教学工作总结
2014/11/13 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL