任何Error对象都有一个堆栈成员,它捕获它被构造的点。
var stack = new Error().stack;
console.log(stack)
或者
console.trace("error")
try ... catch(err) { console.log(err)} 同样可以记录错误堆栈,因为抛出的是 Error 对象,可以获取到 stack 属性。
Error.prototype 对象包含如下属性:
- constructor--指向实例的构造函数
- message--错误信息
- name--错误的名字(类型)
上述是 Error.prototype 的标准属性, 此外, 不同的运行环境都有其特定的属性. 在例如 Node, Firefox, Chrome, Edge, IE 10+, Opera 以及 Safari 6+ 这样的环境中, Error 对象具备 stack 属性, 该属性包含了错误的堆栈轨迹. 一个错误实例的堆栈轨迹包含了自构造函数之后的所有堆栈结构.
- Errors 也可以被作为其它对象, 你也不必抛出它们, 这也是为什么大多数回调函数把 Errors 作为第一个参数的原因。
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);
}
});
处理堆栈
这一节是针对支持 Error.captureStackTrace
的运行环境, 例如Nodejs.
Error.captureStackTrace
的第一个参数是 object
, 第二个可选参数是一个 function
. Error.captureStackTrace
会捕获堆栈信息, 并在第一个参数中创建 stack
属性来存储捕获到的堆栈信息. 如果提供了第二个参数, 该函数将作为堆栈调用的终点. 因此, 捕获到的堆栈信息将只显示该函数调用之前的信息. 这样处理方式的好处就是用来隐藏一些与用户无关的内部实现细节.
网友评论