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使用HTML5的window.postMessage实现跨域通信例子
Apr 11 Javascript
jQuery自定义添加"$"与解决"$"冲突的方法
Jan 19 Javascript
jQuery实现鼠标划过修改样式的方法
Apr 14 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 Javascript
js实现文本框输入文字个数限制代码
Dec 25 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
Mar 02 Javascript
JavaScript中点击事件的写法
Jun 28 Javascript
Javascript 两种刷新方法以及区别和适用范围
Jan 17 Javascript
详解webpack解惑:require的五种用法
Jun 09 Javascript
JS实现扫码枪扫描二维码功能
Jan 03 Javascript
node.js +mongdb实现登录功能
Jun 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
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
webpack多页面开发实践
2017/12/18 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
vue.js计算属性computed用法实例分析
2018/07/06 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Django实现自定义404,500页面教程
2017/03/26 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python opencv之SIFT算法示例
2018/02/24 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
高中数学教师求职信
2013/10/30 职场文书
应届大学生求职的自我评价
2013/11/17 职场文书
社区志愿者心得体会
2014/01/03 职场文书
员工薪酬福利制度
2014/01/17 职场文书
消防安全管理制度
2014/02/01 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
档案保密承诺书
2014/06/03 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
素质拓展训练感想
2015/08/07 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python