try { throw new Error(3) } catch (e) { console.log(e) } try { setTimeout(function () { throw new Error(5) }, 100) } catch (e) { console.log(e) }
以上代码中,在浏览器是分别输出Error: 3(正常打印出错误实例,未报错)和 Uncaught Error: 5(一个未捕获错误):
原因:以上例子中第二个try catch捕获不到错误,因为try catch是同步的,执行到setTimeout时把它放到了异步任务队列里(setTimeout是异步的)没有立即执行setTimeout就往下走了,同步任务执行完再回头把异步任务队列里的setTimeout回调函数拿出来执行就报错了。
要捕获到异常,必须在throw new Error的直接外层用try catch包起来才行:
setTimeout(()=>{ try{ throw new Error('fail'); }catch (e){ console.log(e); } },1000);
promise的异常处理可以用自带的catch回调函数。
window.onerror = function(err) { return true;}; // 这样可以彻底忽略所有错误