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

Any problems with handling a JavaScript exception by throwing in a setTimeout()?

本文关键字:JavaScript 处理 异常 问题 任何 setTimeout      更新时间:2024-04-22

我有一个函数可能会引发异常。我想把这个异常暴露为抛出的异常(本质上是相同的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不同。

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

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线程处于空闲模式时执行。我也建议用有意义的描述重新抛出异常,因为您已经知道它发生在哪里(可能还有为什么)。

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

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