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 原型学习总结
Oct 29 Javascript
JavaScript 5 新增 Array 方法实现介绍
Feb 06 Javascript
js数组操作学习总结
Nov 04 Javascript
jQuery使用CSS()方法给指定元素同时设置多个样式
Mar 26 Javascript
javascript 解决浏览器不支持的问题
Sep 24 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
Dec 08 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
javascript实现一款好看的秒表计时器
Sep 05 Javascript
js实现随机点名功能
Dec 23 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 Javascript
vue实现书本翻页动画效果实例详解
Apr 08 Vue.js
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
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
Python算法之栈(stack)的实现
2014/08/18 Python
python图像处理之反色实现方法
2015/05/30 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
安全生产年活动总结
2014/08/29 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年租房协议书范本
2014/10/30 职场文书
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python
Oracle 触发器trigger使用案例
2022/02/24 Oracle
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA