我有一个可能抛出异常的函数。我想公开该异常就像它被抛出一样(基本上是相同的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
没有相同的用户体验。
答案 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);
}
}