通过抛出setTimeout()来处理JavaScript异常的任何问题?

时间:2013-12-06 20:45:28

标签: javascript

我有一个可能抛出异常的函数。我想公开该异常就像它被抛出一样(基本上是相同的UI体验,因此它在浏览器窗口和控制台中显示为异常,任何调试工具)。但我不希望异常停止执行原始函数。这个问题的一个解决方案是捕获并重新抛出异常,但是在setTimeout()中。这样它将在稍后调用,但不会中断最初发生的函数。

示例:

var f = function() {
  try {
    // exception could throw in here somewhere
  } catch (e) {
    setTimeout(
      function() {
        throw e;
      },
      100
    );
  }
}

我的问题是,这种方法有什么缺陷吗? (除了显而易见的,它可能会稍微延迟报告?)或者这是JavaScript社区中相对安全且被广泛接受的习惯用法?是否有任何微小的改进?

澄清:我想避免使用console.log和console.error,因为它们是非标准的,并且console.log与throw e没有相同的用户体验。

2 个答案:

答案 0 :(得分:4)

如果您只想在控制台中报告错误而不中断执行,请使用

console.error(e);

代替。它可能会导致IE中出现一些问题,因为在未打开开发工具时未定义console。所以你可以做到

console = window.console || {error: function(){}};

在代码开头的某处,或者如果它是一个您要报告错误的地方

console && console.error(e);

修改

如果你想抛出错误,没有必要等待很长时间 - 你可以做到

setTimeout(function() { 
    throw new Error('Some meaningful error message. Caused by: ' + e.toString());
}, 0);
一旦UI线程处于空闲模式,将执行

。我还建议用有意义的描述重新抛出异常,因为你知道它发生在哪里(也可能是为什么)。

答案 1 :(得分:1)

如果您只想向控制台写错误,则无需超时:

var f = function() {
  try {
    // exception could throw in here somewhere
  } catch (e) {
    console.error(e); 
  }
}