使用本机或未知堆栈帧位置创建错误

时间:2016-08-09 21:33:42

标签: javascript runtime-error v8

根据V8 Stack Trace API,本地或未知位置存在错误。是否有可能用vanilla js产生这些错误?

2 个答案:

答案 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。但您可以按如下方式发送自己的自定义错误:

1:捕获错误堆栈:

要获取错误的堆栈,您可以通过访问其.stack属性来访问它。

例如:

fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        console.log(err.stack);
    }
});

2:发送您自己的自定义堆栈(基本上是任何文本)

Stack属性被添加到对象上,就像任何属性一样,使您可以执行以下操作:

function trace() {
  try {
    var err = new Error('myError');
    err.stack = "custom written stack!";
    throw err;
  }
  catch(e) {
    console.log(e.stack);
  }
}

3:使用captureStackTrace记录正确的自定义堆栈

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