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 相关文章推荐
?牟┛途W扣了一??效果出?? target=
May 27 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
May 25 Javascript
Javascript保存网页为图片借助于html2canvas库实现
Sep 05 Javascript
jQuery中index()方法用法实例
Dec 27 Javascript
JavaScript数组去重的五种方法
Nov 05 Javascript
jQuery实现简单的tab标签页效果
Sep 12 Javascript
关于js原型的面试题讲解
Sep 25 Javascript
JS实现页面打印(整体、局部)
Aug 18 Javascript
layui自定义ajax左侧三级菜单
Jul 26 Javascript
layui table复选框禁止某几条勾选的实例
Sep 20 Javascript
vue请求数据的三种方式
Mar 04 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
制作特殊字的脚本
2006/06/26 Javascript
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
Javascript函数的参数
2015/07/16 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
Python入门之modf()方法的使用
2015/05/15 Python
Python中subprocess的简单使用示例
2015/07/28 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
django 读取图片到页面实例
2020/03/27 Python
详解Python 最短匹配模式
2020/07/29 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
2015年信息化建设工作总结
2015/07/23 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
go goroutine 怎样进行错误处理
2021/07/16 Golang