根据V8 Stack Trace API,本地或未知位置存在错误。是否有可能用vanilla js产生这些错误?
答案 0 :(得分:1)
您可以使用Vanilla JS在native
处收到错误,如下所示:
> try { String.fromCodePoint(-42); } catch(e) { console.log(e.stack);}
RangeError: Invalid code point -42
at Function.fromCodePoint (native)
at <anonymous>:1:14
在V8中,一些函数在JS中实现。例如,String.fromCodePoint在这里https://github.com/v8/v8/blob/5.2-lkgr/src/js/string.js#L784。其他功能在C ++中实现。我相信,如果在JS函数中抛出错误,它就是原生的。如果该函数是用C ++实现的,则错误不在native.
这里是encodeURI
的错误,它是用C ++(https://github.com/v8/v8/blob/master/src/uri.cc#L180)实现的。
> try { encodeURI('\uDFFF'); } catch(e) { console.log(e.stack);}
URIError: URI malformed
at <anonymous>:1:7
答案 1 :(得分:0)
这是一个很长的主题,但是v8是用c ++编写的,堆栈是用c ++维护的,当从c ++抛出新的错误时,它会被赋予javascript。但您可以按如下方式发送自己的自定义错误:
要获取错误的堆栈,您可以通过访问其.stack
属性来访问它。
例如:
fs.readFile('./Index.html', function read(err, data) {
if (err) {
console.log(err.stack);
}
});
Stack属性被添加到对象上,就像任何属性一样,使您可以执行以下操作:
function trace() {
try {
var err = new Error('myError');
err.stack = "custom written stack!";
throw err;
}
catch(e) {
console.log(e.stack);
}
}
Error.captureStackTrace(targetObject[, constructorOpt])
在targetObject上创建一个.stack属性,当访问该属性时返回该属性 表示代码中位置的字符串 调用了Error.captureStackTrace()。
function MyError() {
Error.captureStackTrace(this, MyError);
}
// Without passing MyError to captureStackTrace, the MyError
// frame would show up in the .stack property. By passing
// the constructor, we omit that frame and all frames above it.
new MyError().stack
要捕获新抛出错误的堆栈,您可以编写以下内容:
function trace() {
try {
throw new Error('myError');
}
catch(e) {
alert(e.stack);
}
}
function b() {
trace();
}
调用b将记录以下内容:
Error: myError
at trace (<anonymous>:3:15)
at b (<anonymous>:10:7)
at <anonymous>:1:1