国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關(guān)于Error.captureStackTrace

weakish / 1734人閱讀

摘要:在一些程序中,有時(shí)會(huì)看到這一語(yǔ)句,用于處理堆棧信息。為了不向使用者暴露自定義類的內(nèi)部細(xì)節(jié),在自定義類內(nèi)部使用時(shí),往往會(huì)傳入?yún)?shù),其值即為自定義類的構(gòu)造函數(shù)。

在一些Node.js程序中,有時(shí)會(huì)看到Error.captureStackTrace()這一語(yǔ)句,用于處理堆棧信息。該語(yǔ)句的標(biāo)準(zhǔn)定義是什么?如何使用?本文將就這些問(wèn)題做一些探討。

標(biāo)準(zhǔn)定義

從字面上來(lái)看,captureStackTrace應(yīng)該是Error構(gòu)造函數(shù)自身的一個(gè)方法。因此,很自然的想到從ECMAScript標(biāo)準(zhǔn)文檔中尋找答案。不幸的是,在標(biāo)準(zhǔn)文檔的19.5 Error Objects章節(jié)中,并未提及任何有關(guān)captureStackTrace的內(nèi)容。看來(lái),這一語(yǔ)句和語(yǔ)言的運(yùn)行環(huán)境有關(guān),并非由JavaScript標(biāo)準(zhǔn)所定義。

既然JavaScript語(yǔ)言標(biāo)準(zhǔn)中沒(méi)有定義captureStackTrace,那就只能從Node.js的文檔中去尋找答案了。Node.js中,關(guān)于Error.captureStackTrace的描述是這樣的:

Error.captureStackTrace(targetObject[, constructorOpt])
targetObject中添加一個(gè).stack屬性。對(duì)該屬性進(jìn)行訪問(wèn)時(shí),將以字符串的形式返回Error.captureStackTrace()語(yǔ)句被調(diào)用時(shí)的代碼位置信息(即:調(diào)用棧歷史)。

以下是一個(gè)最簡(jiǎn)單的例子:

const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack  // 效果與`new Error().stack`類似
與`errorObject.stack`不同的是,`errorObject.stack `所返回的字符串的第一行一般遵循`ErrorType: message`的形式,而使用captureStackTrace所得到的字符串的第一行則一般以`targetObject .toString()`開(kāi)頭。

除了targetObject, captureStackTrace還接受一個(gè)類型為function的可選參數(shù)constructorOpt,當(dāng)傳遞該參數(shù)時(shí),調(diào)用棧中所有constructorOpt函數(shù)之上的信息(包括constructorOpt函數(shù)自身),都會(huì)在訪問(wèn)targetObject.stack時(shí)被忽略。當(dāng)需要對(duì)終端用戶隱藏內(nèi)部的技術(shù)細(xì)節(jié)時(shí),constructorOpt參數(shù)會(huì)很有用。比如:

function MyError() {
  Error.captureStackTrace(this, MyError);
}

// 如果沒(méi)有向captureStackTrace傳遞MyError參數(shù),則在訪問(wèn).stack屬性時(shí),MyError及其內(nèi)部信息將會(huì)出現(xiàn)在堆棧信息中。當(dāng)傳遞MyError參數(shù)時(shí),這些信息會(huì)被忽略。
new MyError().stack

進(jìn)一步的探究發(fā)現(xiàn),Error.captureStackTrace()并非Node.js所創(chuàng)造,而是源自V8引擎的Stack Trace API(事實(shí)上,Node.js的Error類中,所有與stack trace有關(guān)的內(nèi)容均依賴于V8的Stack Trace API)。從語(yǔ)法上來(lái)說(shuō),Node.js中的Error.captureStackTrace()與V8引擎中所暴露的接口完全一致。

在瀏覽器領(lǐng)域,除了使用V8引擎的Google Chrome,其它瀏覽器中不存在Error.captureStackTrace()這一接口。

使用場(chǎng)景

由于Error.captureStackTrace()可以返回調(diào)用堆棧信息,因此在自定義Error類的內(nèi)部經(jīng)常會(huì)使用該函數(shù),用以在error對(duì)象上添加合理的stack屬性。上文中的MyError類即是一個(gè)最簡(jiǎn)單的例子。

為了不向使用者暴露自定義Error類的內(nèi)部細(xì)節(jié),在自定義Error類內(nèi)部使用captureStackTrace時(shí),往往會(huì)傳入constructorOpt參數(shù),其值即為自定義 Error類的構(gòu)造函數(shù)。具體做法有3種:

Error.captureStackTrace(this, MyError); 將構(gòu)造函數(shù)的變量名作為constructorOpt參數(shù)傳入。這一做法比較簡(jiǎn)單、直接,但不利之處也比較明顯:代碼所要傳達(dá)的是“忽略當(dāng)前構(gòu)造函數(shù)內(nèi)部的堆棧調(diào)用信息”,而以具體的構(gòu)造函數(shù)作為參數(shù)傳入使得這一語(yǔ)句缺乏通用性,不利于程序的進(jìn)一步抽象。

Error.captureStackTrace(this, this.constructor); 通過(guò)this.constructor傳入constructorOpt參數(shù)。與上一種方法相比,這一方式更具通用性。在自定義Error類中使用captureStackTrace時(shí),推薦采用該方法。

Error.captureStackTrace(this, arguments.callee);通過(guò)arguments.callee將“當(dāng)前函數(shù)”作為constructorOpt參數(shù)傳入。不過(guò),由于ES5的strict模式中禁用了arguments.callee,因此不建議使用該寫(xiě)法。

除了自定義Error類的使用場(chǎng)景,在JavaScript程序中,當(dāng)需要獲知調(diào)用堆棧信息時(shí),都可以通過(guò)調(diào)用Error.captureStackTrace()來(lái)實(shí)現(xiàn)。以往如果需要獲知調(diào)用堆棧信息,一般的做法是拋出一個(gè)Error對(duì)象并立即加以捕捉,通過(guò)訪問(wèn)該對(duì)象的stack屬性來(lái)獲得調(diào)用堆棧。一個(gè)簡(jiǎn)單的例子如下:

try {
  throw new Error();
} catch (e) {
  // e.stack 中包含了堆棧數(shù)據(jù),可以進(jìn)行處理從而忽略不感興趣的堆棧信息
}

與這種做法相比,可以很明顯的看到,使用Error.captureStackTrace()會(huì)更簡(jiǎn)潔、易用,也更優(yōu)雅;而這,也許就是V8中添加Error.captureStackTrace()的原因。

鏈接:http://blog.shaochuancs.com/about-error-capturestacktrace/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/80599.html

相關(guān)文章

  • JavaScript 中的錯(cuò)誤處理機(jī)制

    摘要:錯(cuò)誤處理在開(kāi)發(fā)和調(diào)試過(guò)程中都顯得尤為重要。跟全局函數(shù)有關(guān)的錯(cuò)誤,在之后已經(jīng)不再出現(xiàn)了內(nèi)部錯(cuò)誤。由引擎拋出的錯(cuò)誤范圍錯(cuò)誤。事件任何沒(méi)有的錯(cuò)誤都會(huì)觸發(fā)對(duì)象的事件。事件可以接收三個(gè)參數(shù)錯(cuò)誤消息錯(cuò)誤所在的和行號(hào)。 錯(cuò)誤處理在開(kāi)發(fā)和調(diào)試過(guò)程中都顯得尤為重要。有些沒(méi)有進(jìn)行錯(cuò)誤處理的應(yīng)用,直接就將瀏覽器的錯(cuò)誤展示給了用戶,極大的降低了用戶體驗(yàn)。比如有些很 low 的網(wǎng)站,打開(kāi)某些頁(yè)面就直接彈出 ob...

    AbnerMing 評(píng)論0 收藏0
  • 翻譯-JavaScript異常和調(diào)用堆棧的處理

    摘要:調(diào)用堆棧實(shí)際上就是一個(gè)方法列表,按調(diào)用順序保存所有在運(yùn)行期被調(diào)用的方法。調(diào)用堆棧會(huì)將當(dāng)前正在執(zhí)行的函數(shù)調(diào)用壓入堆棧,一旦函數(shù)調(diào)用結(jié)束,又會(huì)將它移出堆棧。 原文 JavaScript Errors and Stack Traces in Depth 調(diào)用棧Call Stack是如何工作的 棧是一個(gè)后進(jìn)先出LIFO (Last in,F(xiàn)irst out)的數(shù)據(jù)結(jié)構(gòu)。調(diào)用堆棧實(shí)際上就是一個(gè)方...

    adam1q84 評(píng)論0 收藏0
  • node錯(cuò)誤處理與日志

    摘要:并不自帶,需要引入庫(kù)運(yùn)行日志文件,此時(shí)在目錄下就生成了今天的日志歡迎訪問(wèn)我的博客 node項(xiàng)目中的錯(cuò)誤處理 node中Error對(duì)象的使用 使用captureStackTrace方法加入自帶的錯(cuò)誤信息 // Error對(duì)象自帶的屬性 Error.captureStackTrace // 如何使用captureStackTrace var obj = { message: so...

    GT 評(píng)論0 收藏0
  • 基礎(chǔ)學(xué)習(xí) - 在JS 中的繼承

    摘要:繼承方法原型鏈繼承父類型子類型子類型的原型為父類型的一個(gè)實(shí)例對(duì)象這種繼承方式把設(shè)置直接設(shè)置為對(duì)象子類就可以通過(guò)原型鏈訪問(wèn)父級(jí)所有的屬性和方法了。但是缺點(diǎn)很明顯,在創(chuàng)建子類的時(shí)候會(huì)調(diào)用調(diào)用兩次父類的構(gòu)造函數(shù)。 起因 最近在使用node-jsonwebtoken中發(fā)現(xiàn)了下面這個(gè)代碼,感覺(jué)挺好看,于是就打算探索一些相關(guān)代碼: showImg(https://segmentfault.com/...

    Taste 評(píng)論0 收藏0
  • 詳解JS錯(cuò)誤處理:前端JS/Vue/React/Iframe/跨域/Node

    摘要:錯(cuò)誤上報(bào)機(jī)制發(fā)送數(shù)據(jù)因?yàn)檎?qǐng)求本身也有可能會(huì)發(fā)生異常,而且有可能會(huì)引發(fā)跨域問(wèn)題,一般情況下更推薦使用動(dòng)態(tài)創(chuàng)建標(biāo)簽的形式進(jìn)行上報(bào)。 js錯(cuò)誤捕獲 js錯(cuò)誤的實(shí)質(zhì),也是發(fā)出一個(gè)事件,處理他 error實(shí)例對(duì)象 對(duì)象屬性 message:錯(cuò)誤提示信息 name:錯(cuò)誤名稱(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 stack:錯(cuò)誤的堆棧(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 對(duì)象類型(7種) Synt...

    張利勇 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<