Appearance
错误处理
本节目标:理解“错误处理”的核心思路,并能把它用于实际开发或面试表达。 错误拋出的部位 一、Promise执行器函数内throw或reject的错误。 二、then方法成功回调中throw或reject的错误。 三、then方法失败回调中throw或reject的错误。 四、catch方法中throw或reject的错误。 五、还有一种是我们代码本身存在错误。如使用未定义变量等 六、执行器函数中resolve一个Error对象或实例兑现或拒绝回调函数中返回一个Error对象都不等于抛出错误,而是resolve一个值为Error的对象;
所有这些抛出的错误都只能通过异步的方式捕获;不能用try catch包裹构造器函数从而以同步的方式捕获;Promise函数执行器中抛出的错误,如果在执行器函数中被try catch捕获,那么就不会再向外抛出错误,也就不会被catch回调函数捕获。
**拋出错误的方式**
一、可以自行使用throw或使用reject拋出:
`const` `promise` `=` `new`Promise(function
(resolve,
reject)
`{`
`//` `throw` `new` `Error('error` `test'),`输出`Error:error` `test`reject(new
Error('error
test1')); }); promise.catch(function
(error)
`{`console.log(error); }); //
`Error:error` `test1`二、在执行器函数中,如果自行使用try catch捕获错误,则错误会被catch方法捕获,并不会再向外抛出;如果将错误向外抛出,在异步回调函数中进行处理,则要使用throw或reject拋出。
// try catch捕获,reject拋出
`const` `promise` `=` `new`Promise(function
(resolve,
reject)
`{`
`try` `{`
`throw` `new`Error('test');
`}` `catch`(e)
`{`
`//` `reject(e);`} }); promise.catch(function
(error)
`{`console.log(error); }); // 无输出 可以发现reject方法的作用,等同于抛出错误。 但有一个重要区别,throw出的错误,可以使用try catch同步捕获; 而reject出的错误,只能在异步回调中获得;
捕获方式: 一、使用then方法的第二个参数:错误回调函数来捕获。 二、使用catch方法来捕获。 Promise.prototype.catch方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。 一般来说,不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。因为这种写法可以捕获前面then方法执行中的错误,也更接近同步的写法(try/catch)。
Promise****中未捕获的错误 Promise 执行器函数中抛出的错误,如果没有指定捕获错误的回调函数:
则错误不会传递到外层同步代码;也不会让promsie外同步代码退出进程,从而终止脚本执行;但会在控制台打印出错误,表明是一个未捕获的错误;const someAsyncThing = function () {return new
Promise(function(resolve,reject){// 下面一行会报错,因为x没有声明
resolve(x+
2);});
};
someAsyncThing().then(function() {
console.log('everythingis
great');
});
setTimeout(()=\> {
console.log(123)
},2000);// Uncaught (in promise) ReferenceError: x is not defined// 123 上面代码中,someAsyncThing函数产生的 Promise 对象,内部有语法错误。浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined,但是不会退出进程、终止脚本执行,2 秒之后还是会输出123。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。
_这个脚本放在服务器执行,退出码就是__0__(即表示执行成功)。不过,__Node_ _有一个__unhandledRejection__事件,专门监听未捕获的__reject__错误,上面的脚本会触发这个事件的监听函数,可以在监听函数里面抛出错误。_
_process__.__on__(__'unhandledRejection'__,_ _function_ _(__err__,_ _p__) {___ _throw_ _err__;____});_
_上面代码中,__unhandledRejection__事件的监听函数有两个参数,第一个是错误对象,第二个是报错的_ _Promise_ _实例,它可以用来了解发生错误的环境信息。_
_注意,__Node_ _有计划在未来废除__unhandledRejection__事件。如果_ _Promise_ _内部有未捕获的错误,会直接终止进程,并且进程的退出码不为_ _0__。_