任何Error對象都有一個堆棧成員,它捕獲它被構(gòu)造的點谎势。
var stack = new Error().stack;
console.log(stack)
或者
console.trace("error")
try ... catch(err) { console.log(err)} 同樣可以記錄錯誤堆棧,因為拋出的是 Error 對象像捶,可以獲取到 stack 屬性坏瞄。
Error.prototype 對象包含如下屬性:
- constructor--指向?qū)嵗臉?gòu)造函數(shù)
- message--錯誤信息
- name--錯誤的名字(類型)
上述是 Error.prototype 的標(biāo)準(zhǔn)屬性, 此外, 不同的運行環(huán)境都有其特定的屬性. 在例如 Node, Firefox, Chrome, Edge, IE 10+, Opera 以及 Safari 6+ 這樣的環(huán)境中, Error 對象具備 stack 屬性, 該屬性包含了錯誤的堆棧軌跡. 一個錯誤實例的堆棧軌跡包含了自構(gòu)造函數(shù)之后的所有堆棧結(jié)構(gòu).
- Errors 也可以被作為其它對象, 你也不必拋出它們, 這也是為什么大多數(shù)回調(diào)函數(shù)把 Errors 作為第一個參數(shù)的原因。
const fs = require('fs');
fs.readdir('/example/i-do-not-exist', function callback(err, dirs) {
if (err instanceof Error) {
// `readdir` will throw an error because that directory does not exist
// We will now be able to use the error object passed by it in our callback function
console.log('Error Message: ' + err.message);
console.log('See? We can use Errors without using try statements.');
} else {
console.log(dirs);
}
});
- Error 對象也可以用于 rejected promise, 這使得很容易處理 rejected promise:
new Promise(function(resolve, reject) {
reject(new Error('The promise was rejected.'));
}).then(function() {
console.log('I am an error.');
}).catch(function(err) {
if (err instanceof Error) {
console.log('The promise was rejected with an error.');
console.log('Error Message: ' + err.message);
}
});
處理堆棧
這一節(jié)是針對支持 Error.captureStackTrace
的運行環(huán)境, 例如Nodejs.
Error.captureStackTrace
的第一個參數(shù)是 object
, 第二個可選參數(shù)是一個 function
. Error.captureStackTrace
會捕獲堆棧信息, 并在第一個參數(shù)中創(chuàng)建 stack
屬性來存儲捕獲到的堆棧信息. 如果提供了第二個參數(shù), 該函數(shù)將作為堆棧調(diào)用的終點. 因此, 捕獲到的堆棧信息將只顯示該函數(shù)調(diào)用之前的信息. 這樣處理方式的好處就是用來隱藏一些與用戶無關(guān)的內(nèi)部實現(xiàn)細(xì)節(jié).