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
Feb 25 Javascript
javascript中的array数组使用技巧
Jan 31 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
Dec 03 Javascript
简述AngularJS的控制器的使用
Jun 16 Javascript
JavaScript Date对象详解
Mar 01 Javascript
基于jquery实现简单的分页控件
Mar 17 Javascript
Vue组件开发初探
Feb 14 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
Dec 12 Javascript
javascript实现自由编辑图片代码详解
Jun 21 Javascript
jQuery 筛选器简单操作示例
Oct 02 jQuery
原生JS与CSS实现软件卸载对话框功能
Dec 05 Javascript
JS轮播图的实现方法2
Aug 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
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
php7下的filesize函数
2019/09/30 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
python中将字典转换成其json字符串
2014/07/16 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
意大利奢侈品网站:Italist
2016/08/23 全球购物
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
三年大学自我鉴定
2014/01/16 职场文书
八一建军节感言
2014/02/28 职场文书
房地产促销活动方案
2014/03/01 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
索尼ICF-5900W收音机测评
2022/04/24 无线电