JavaScript异常错误处理指南( 二 )


【JavaScript异常错误处理指南】var promise = new Promise(executor);promise.then(onFulfilled, onRejected);比较容易遗漏错误处理的地方有 executor 和 onFulfilled,在这些函数中如果发生错误都不能被全局捕获 。
正确的捕获 Promise 的错误,应该使用 Promise.prototype.catch 方法,意外的错误和使用 reject 主动捕获的错误都会触发 catch 方法 。
 
catch 方法中通常会接收到一个 Error 对象,但是当调用 reject 函数时传入的是一个非 Error 对象时,catch 方法也会接收到一个非 Error 对象,这里的 reject 和 throw 的表现是一样的,所以在使用 reject 时,最好是传入一个 Error 对象 。
reject(new Error('this is reject message'));值得注意的是,如果 Promise 的 executor 中存在 setTimeout 语句时,setTimeout 的报错会被全局捕获 。
 
Async FunctionAsync Function 和 Promise 一样,发生错误不会被全局的 window.onerror 捕获,所以在使用时如果有报错,需要手动增加 try/catch 语句 。
匿名函数匿名函数的使用在 JavaScript 中很常见,但是当出现匿名函数的报错时,在错误追溯栈中会以 anonymous 来标识错误,为了排查错误方便,可以将函数进行命名,或者使用函数的 displayName 属性 。
函数如果有 displayName 属性,在错误栈中会展示该属性值,如果用于命名重要的业务逻辑属性,将有效帮助排查错误 。
 
throw error上面说了很多错误捕获的注意点,如果要主动的抛错,都会使用 throw 来抛错,常见的几种抛错方法如下:
throw new Error('Problem description.')// 方法 1throw Error('Problem description.')// 方法 2throw 'Problem description.'// 方法 3throw null// 方法 4其中方法 1 和方法 2 的效果一样,浏览器都能正确的展示错误追溯栈 。方法 3 和方法 4 不推荐,虽然能抛错,但是在抛错的时候不能展示错误追溯栈 。
try/catch 和 throw,一个用来捕获错误,一个用来抛出错误,如果两个结合起来用通常等于脱了裤子放屁多此一举,唯一有点用的是可以对错误信息进行再加工 。
可以在 Chrome 控制台中模拟出一个结合使用的实际场景 。
try {foo();}catch (err) {err.message = 'Catch the error: ' + err.message;throw Error(err);}由于在 catch 块中又抛出了错误,所以该错误没有被捕获到,但此时错误信息经过了二次封装 。
Uncaught Error: ReferenceError: Catch the error: foo is not defined通过对错误信息的二次封装,可以增加一些有利于快速定位错误的额外信息 。
 
原作者:雨夜带刀's Blog




推荐阅读