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

首頁 > 語言 > JavaScript > 正文

JavaScript錯誤處理和堆棧追蹤詳解

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

有時我們會忽略錯誤處理和堆棧追蹤的一些細節, 但是這些細節對于寫與測試或錯誤處理相關的庫來說是非常有用的. 例如這周, 對于 Chai 就有一個非常棒的PR, 該PR極大地改善了我們處理堆棧的方式, 當用戶的斷言失敗的時候, 我們會給予更多的提示信息(幫助用戶進行定位).

合理地處理堆棧信息能使你清除無用的數據, 而只專注于有用的數據. 同時, 當更好地理解 Errors 對象及其相關屬性之后, 能有助于你更充分地利用 Errors.

(函數的)調用棧是怎么工作的

在談論錯誤之前, 先要了解下(函數的)調用棧的原理:

當有一個函數被調用的時候, 它就被壓入到堆棧的頂部, 該函數運行完成之后, 又會從堆棧的頂部被移除.

堆棧的數據結構就是后進先出, 以 LIFO (last in, first out) 著稱.

例如:

function c() {  console.log('c');} function b() {  console.log('b');  c();} function a() {  console.log('a');  b();} a();

在上述的示例中, 當函數 a 運行時, 其會被添加到堆棧的頂部. 然后, 當函數 b 在函數 a 的內部被調用時, 函數 b 會被壓入到堆棧的頂部. 當函數 c 在函數 b 的內部被調用時也會被壓入到堆棧的頂部.

當函數 c 運行時, 堆棧中就包含了 a, b 和 c(按此順序).

當函數 c 運行完畢之后, 就會從堆棧的頂部被移除, 然后函數調用的控制流就回到函數 b. 函數 b 運行完之后, 也會從堆棧的頂部被移除, 然后函數調用的控制流就回到函數 a. 最后, 函數 a 運行完成之后也會從堆棧的頂部被移除.

為了更好地在demo中演示堆棧的行為, 可以使用 console.trace() 在控制臺輸出當前的堆棧數據. 同時, 你要以從上至下的順序閱讀輸出的堆棧數據.

function c() {  console.log('c');  console.trace();} function b() {  console.log('b');  c();} function a() {  console.log('a');  b();} a();

在 Node 的 REPL 模式中運行上述代碼會得到如下輸出:

Trace  at c (repl:3:9)  at b (repl:3:1)  at a (repl:3:1)  at repl:1:1 // <-- For now feel free to ignore anything below this point, these are Node's internals  at realRunInThisContextScript (vm.js:22:35)  at sigintHandlersWrap (vm.js:98:12)  at ContextifyScript.Script.runInThisContext (vm.js:24:12)  at REPLServer.defaultEval (repl.js:313:29)  at bound (domain.js:280:14)  at REPLServer.runBound [as eval] (domain.js:293:12)

正如所看到的, 當從函數 c 中輸出時, 堆棧中包含了函數 a, b 以及c.

如果在函數 c 運行完成之后, 在函數 b 中輸出當前的堆棧數據, 就會看到函數 c 已經從堆棧的頂部被移除, 此時堆棧中僅包括函數 a 和 b.

function c() {  console.log('c');} function b() {  console.log('b');  c();  console.trace();} function a() {  console.log('a');  b();}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 大同县| 南漳县| 洛隆县| 大庆市| 措勤县| 汾阳市| 收藏| 休宁县| 平安县| 保靖县| 惠来县| 德昌县| 贡嘎县| 盈江县| 正阳县| 汉寿县| 钟山县| 襄城县| 嘉荫县| 高陵县| 万载县| 新巴尔虎右旗| 屯门区| 龙里县| 乐平市| 伊春市| 广丰县| 芦溪县| 双柏县| 永济市| 营口市| 永寿县| 林周县| 永川市| 赤壁市| 白银市| 陕西省| 石景山区| 桐梓县| 大足县| 梨树县|