日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

IE10 Error.stack 讓腳本調(diào)試更加方便快捷

在IE10中已經(jīng)新加入了Error.stack 的支持,可以加快開發(fā)人員的腳本調(diào)試,并更正錯誤 。尤其是一些難以重現(xiàn)的錯誤,如異步操作等 。以下內(nèi)容來自于微軟IE團(tuán)隊,對于這個特性描述的非常詳細(xì) 。
調(diào)試應(yīng)用程序JavaScript 中的結(jié)構(gòu)化錯誤處理依賴于 throw 和 try/catch,開發(fā)人員將在其中聲明一個錯誤,并將控制流傳遞至處理錯誤的程序的某一部分 。當(dāng)某一錯誤被引發(fā)時,Chakra,即 Internet Explorer 中的 JavaScript 引擎將捕獲引發(fā)該錯誤的調(diào)用鏈,這一過程也被稱為調(diào)用堆棧 。如果被引發(fā)的對象是一個 Error(或者是一個函數(shù),且其原型鏈將導(dǎo)致 Error),那么 Chakra 將創(chuàng)建一個堆棧跟蹤,即可人工讀取的調(diào)用堆棧列表 。該列表將被表示為一種屬性,即 Error 對象中的 stack 。stack 包含錯誤消息、函數(shù)名稱和該函數(shù)的源文件位置信息 。這些信息將有助于開發(fā)人員了解所調(diào)用的函數(shù),甚至查看錯誤的代碼行,從而迅速診斷缺陷 。例如,這些信息可能表明傳遞至函數(shù)的某一參數(shù)為空,或為無效類型 。
讓我們一同來查看一個簡單的腳本,并以此展開深入討論 。該腳本試圖計算 (0, 2) 和 (12, 10) 兩點(diǎn)間的距離:

復(fù)制代碼代碼如下:
(function () {
’use strict’;
function squareRoot(n) {
if (n0)
throw new Error(’Cannot take square root of negative number.’);
return Math.sqrt(n);
}
function square(n) {
return n * n;
}
function pointDistance(pt1, pt2) {
return squareRoot((pt1.x - pt2.x)(pt1.y - pt2.y));
}
function sample() {
var pt1 = { x: 0, y: 2 };
var pt2 = { x: 12, y: 10 };
console.log(’Distance is: ’pointDistance(pt1, pt2));
}
try {
sample();
}
catch (e) {
console.log(e.stack);
}
})();

該腳本中包含一個缺陷,其未調(diào)整組件間的差異 。因此,對于某些輸入而言,pointDistance 函數(shù)將返回錯誤的結(jié)果;而在其他情況中,該腳本將導(dǎo)致錯誤發(fā)生 。為了理解堆棧跟蹤的含義,讓我們一同來查看 F12 開發(fā)人員工具中的錯誤,并查看其腳本選項卡:

IE10 Error.stack 讓腳本調(diào)試更加方便快捷


堆棧跟蹤將轉(zhuǎn)儲至 catch 子句中的控制臺,由于其位于堆棧的頂部,因此起源于 squareRoot 函數(shù)的錯誤將變得顯而易見 。為了調(diào)試這一問題,開發(fā)人員無需深入查看堆棧跟蹤;系統(tǒng)已違反 squareRoot 的前置條件,而且只需查看堆棧的上一級,原因?qū)⒆兊檬置髁耍簊quareRoot 調(diào)用內(nèi)的子表達(dá)式自身應(yīng)該為 square 的參數(shù) 。
調(diào)試過程中,stack 屬性將有助于識別用于設(shè)置斷點(diǎn)的代碼 。請記?。耗€可使用其它方法來查看調(diào)用堆棧:例如,如果您將腳本調(diào)試程序設(shè)置為捕獲異常即中斷的模式,那么您可使用該調(diào)試程序來檢查調(diào)用堆棧 。對于部署的應(yīng)用程序,您可考慮在 try/catch 內(nèi)合并問題代碼,以捕獲失敗的調(diào)用,并將其記錄于服務(wù)器中 。隨后,開發(fā)人員可查看調(diào)用堆棧,以隔離問題區(qū)域 。
DOM 異常與 Error.stack此前,我曾注意到被引發(fā)的對象必須為 Error 或通過其原型鏈導(dǎo)致 Error 。這是有意而為之;JavaScript 可支持引發(fā)任何對象,甚至包括作為異常的基元 。盡管系統(tǒng)可捕獲和檢查所有這些對象,但是它們的全部用途并非包含錯誤或診斷信息 。因此,引發(fā)過程中僅將更新錯誤的 stack 屬性 。
即便對象為 DOM 異常,它們也不包含可導(dǎo)致 Error 的原型鏈,因此它們將不包含 stack 屬性 。在某些應(yīng)用場景中,您需要執(zhí)行 DOM 操作,并希望暴露 JavaScript 兼容的錯誤,那么您可能希望在 try/catch 數(shù)據(jù)塊內(nèi)合并您的 DOM 操作代碼,并在 catch 子句中引發(fā)一個新的 Error 對象:

復(fù)制代碼代碼如下:
function causesDomError() {

推薦閱讀