国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

簡單了解TypeScript中如何繼承 Error 類

2024-05-06 15:37:37
字體:
來源:轉載
供稿:網友

前言

在JavaScript 中很多時候都需要自定義錯誤,尤其是開發(fā) Node.js 應用的時候。 比如一個典型的網站服務器可能需要有 NetworkError, DatabaseError, UnauthorizedError 等。 我們希望這些類都擁有 Error 的特性:有錯誤消息、有調用棧、有方便打印的 toString 等。 最直觀的實現(xiàn)方式便是 繼承 Error 類。 但考慮 TypeScript 需要編譯到 ES5 兼容性問題會較為復雜, 本文用來幫助理解 TypeScript 中繼承 Error 的問題來源以及對應的幾種解決方式。

我們需要怎樣的 CustomError

為了容易討論最佳實踐,首先明確我們自定義的 CustomError 需要做到哪些功能。 下面是 Harttle 的觀點:

    可以調用 new CustomError() 來創(chuàng)建,并且 instanceof Error 操作應該返回 true??梢杂脕韯?chuàng)建是基本要求,能夠被視為 Error 的實例能夠兼容既有系統(tǒng)(比如 toString() 要返回調用棧),同時符合慣例。 .stack 屬性首行應為 CustomeError: <message>。如果是 Error: <message> 可能就沒那么漂亮。 .stack 屬性應當包含調用棧并指向 new CustomError() 的那一行。這一點可能是關鍵,如果指向 CustomError 構造函數(shù)中的某一行,就會給這個類的使用方造成困惑。

下面舉個例子,這是一個 message 為 "intended" 的 CustomError 的 .stack 屬性值:

CustomError: intendedat Object.<anonymous> (/Users/harttle/Downloads/bar/a.js:10:13)at Module._compile (module.js:653:30)at Object.Module._extensions..js (module.js:664:10)at Module.load (module.js:566:32)at tryModuleLoad (module.js:506:12)at Function.Module._load (module.js:498:3)at Function.Module.runMain (module.js:694:10)at startup (bootstrap_node.js:204:16)at bootstrap_node.js:625:3

ES5 中如何繼承 Error?

Error 是一個特殊的對象,或者說 JavaScript 的 new 是一個奇葩的存在。 為方便后續(xù)討論,我們先討論組 ES5 時代是怎樣繼承 Error 的。 我們說 JavaScript 是一門混雜的語言,如何繼承 Error 就是一個典型的例子。 如果你熟悉 原型繼承的方式,應該會寫出如下代碼:

function CustomError (message) {Error.call(this, message)}CustomError.prototype = new Error()

因為 stack 只在 new 的時候生成,上述實現(xiàn)不能滿足功能 2 和功能 3,也就是說:

stack 的第一行是總是 Error 而不是 CustomError 且不包含 message 信息。 stack 總是指向 new Error() 的那一行,而不是 new CustomError()。

Node 文檔 中描述了一個 captureStackTrace 方法來解決這個問題,改動后的實現(xiàn)如下:

function CustomError (msg) {this.name = 'CustomError'this.message = msgError.captureStackTrace(this, CustomError)}CustomError.prototype = new Error()

其中 .captureStackTrace() 會使用傳入對象的 name 和 message 來生成 stack 的前綴;同時第二個參數(shù)用來指定在調用棧中忽略掉哪一部分,這樣棧就會指向 new CustomError 的地方而不是 captureStackTrace() 的地方。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 崇左市| 邵东县| 巴彦淖尔市| 石棉县| 乐山市| 沈丘县| 琼结县| 汽车| 安庆市| 鲁甸县| 聊城市| 阳谷县| 大庆市| 贵溪市| 九江市| 乐清市| 凌源市| 隆子县| 天柱县| 南岸区| 新河县| 保亭| 绥宁县| 曲松县| 任丘市| 牟定县| 柯坪县| 开封县| 平乐县| 大荔县| 思南县| 汝城县| 丁青县| 江门市| 莱西市| 南通市| 澄迈县| 杭锦后旗| 浪卡子县| 翁牛特旗| 平潭县|