Angular 如何處理未可知異常錯(cuò)誤

寫在前面

代碼寫得再好,始終都無法完整的處理所有可能產(chǎn)生異常,特別是生產(chǎn)環(huán)境中的應(yīng)用莽鸭,很大一部分是數(shù)據(jù)來自用戶、遠(yuǎn)程珠移,很難保證所有數(shù)據(jù)都按程序規(guī)定的產(chǎn)生。事實(shí)上,除非測試人員發(fā)現(xiàn)或者客戶報(bào)告钧惧,否則都無法得知暇韧。因此,將應(yīng)用產(chǎn)生的未可知異常進(jìn)而上報(bào)是非常重要的環(huán)節(jié)浓瞪。

Angular 默認(rèn)情況下也提供了全局的異常管理懈玻,當(dāng)發(fā)生異常時(shí),會(huì)把它扔到 Console 控制臺(tái)上乾颁。如果你在使用 NG-ZORRO 時(shí)涂乌,可能經(jīng)常就會(huì)遇到 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 統(tǒng)一管理異常消息英岭,而且只需要覆蓋其中的 handleError 方法并重新處理異常消息即可湾盒。

ErrorHandler

首先創(chuàng)建一個(gè) custom-error-handler.ts 文件:

import { ErrorHandler, Injectable } from '@angular/core';

@Injectable()
export class CustomErrorHandler extends ErrorHandler {
  handleError(error: any): void {
    super.handleError(error);
  }
}

CustomErrorHandler 可以完整的獲取當(dāng)前用戶數(shù)據(jù)、當(dāng)前異常消息對象等诅妹,并允許通過 HttpClient 上報(bào)給后端罚勾。

以下是 NG-ALAIN 的文檔站,由于是使用 Google Analytics 來分析吭狡,只需要將異常消息轉(zhuǎn)給 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 模塊內(nèi)注冊 CustomErrorHandler

@NgModule({
    providers: [
        { provide: ErrorHandler, useClass: CustomErrorHandler },
    ]
})
export class AppModule { }

結(jié)論

事實(shí)上還有一項(xiàng)非常重要的工作,生產(chǎn)環(huán)境中都是打包壓縮過后的划煮,換言之所產(chǎn)生的異常消息也是無法與實(shí)際代碼行數(shù)相同的數(shù)字送丰,這就需要 SourceMap 的支持,當(dāng)然正常的生產(chǎn)環(huán)境是不會(huì)發(fā)布這份文件的弛秋,所以如果想要得到正確的行列數(shù)器躏,還是需要借助一層中間層,在后端利用 source-map 模塊來解析出真正的行列數(shù)值铐懊。

Angular 的依賴注入(DI)系統(tǒng)可以使我們快速替換一些 Angular 內(nèi)置模塊邀桑,從而實(shí)現(xiàn)在不修改業(yè)務(wù)層面時(shí)快速解決一些特殊需求。

(完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末科乎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贼急,更是在濱河造成了極大的恐慌茅茂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件太抓,死亡現(xiàn)場離奇詭異空闲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)走敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門碴倾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事跌榔∫煅悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵僧须,是天一觀的道長纲刀。 經(jīng)常有香客問我,道長担平,這世上最難降的妖魔是什么示绊? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮暂论,結(jié)果婚禮上面褐,老公的妹妹穿的比我還像新娘。我一直安慰自己取胎,他們只是感情好盆耽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扼菠,像睡著了一般摄杂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上循榆,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天析恢,我揣著相機(jī)與錄音,去河邊找鬼秧饮。 笑死映挂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盗尸。 我是一名探鬼主播柑船,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泼各!你這毒婦竟也來了鞍时?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤扣蜻,失蹤者是張志新(化名)和其女友劉穎逆巍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莽使,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锐极,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芳肌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灵再。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肋层,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翎迁,到底是詐尸還是另有隱情栋猖,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布鸳兽,位于F島的核電站掂铐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏揍异。R本人自食惡果不足惜全陨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衷掷。 院中可真熱鬧辱姨,春花似錦、人聲如沸戚嗅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懦胞。三九已至替久,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躏尉,已是汗流浹背蚯根。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胀糜,地道東北人颅拦。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像教藻,于是被迫代替她去往敵國和親距帅。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Angular 1.創(chuàng)建模塊: var oneApp = angular.module("myApp"括堤,[ ] )...
    于曉魚閱讀 773評(píng)論 0 6
  • Angular 創(chuàng)建模塊: var oneApp = angular.module("myApp"碌秸,[ ] ) ...
    AkaTBS閱讀 1,969評(píng)論 0 17
  • 在前端異常處理是非常重要的,包括客戶端和服務(wù)端的異常痊臭。之前異常處理是對于每個(gè)異步函數(shù)添加err處理哮肚,這樣不僅加大了...
    小紀(jì)同學(xué)_閱讀 1,316評(píng)論 0 1
  • 久違的晴天,家長會(huì)广匙。 家長大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了恼策。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)鸦致。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評(píng)論 16 22
  • 今天感恩節(jié)哎潮剪,感謝一直在我身邊的親朋好友。感恩相遇分唾!感恩不離不棄抗碰。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評(píng)論 0 11