如何处理异步中的错误?
- setTimeout
try {
setTimeout(function () {
throw new Error('error!');
}, 300)
} catch (e) {
console.log('eeee!') // 不会输出,捕获不到错误
console.log(e)
}
解决方案:
// 把try放到代码块内部
setTimeout(function () {
try {
throw new Error('error!');
} catch (e) {
console.error(e);
}
}, 300)
通过promise解决
const promise = new Promise((resolve, reject) => {
setTimeout(function () {
try {
throw new Error('error!');
} catch (e) {
reject(e)
}
}, 300)
})
promise
.then(result => console.log("Ok " + result))
.catch(error => console.error("Ouch " + error)) // 输出Ouch,说明捕获到了
-
Promise的错误可以通过catch进行捕获
-
Genertor中的错误处理
- 函数内部异常
function *gen() { const a = 1; yield a = 2; // 故意写错 } const task = gen(); try { task.next(); } catch (e) { console.log('捕获到错误了:',e); }
- 通过生成器的throw()抛出异常
这里需要注意的是当生成器抛出错误后会被捕获,但是会向下执行一个yield
function* gen() { try { yield console.log(1); } catch (e) { console.log(e); } yield console.log(2); } const task = gen(); task.next(); task.throw("抛出了异常") // 输出结果是1 抛出了异常 2
-
async await中的错误,可以通过try()catch{}进行捕获,也可以使用第三方库await-to-js进行处理
原理就是包装了一层,使第一个参数返回的永远都是错误信息
import to from './to.js';
async function asyncTask() {
let err, user, savedTask;
[err, user] = await to(UserModel.findById(1));
if(!user) throw new CustomerError('No user found');
[err, savedTask] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));
if(err) throw new CustomError('Error occurred while saving task');
if(user.notificationsEnabled) {
const [err] = await to(NotificationService.sendNotification(user.id, 'Task Created'));
if (err) console.error('Just log the error and continue flow');
}
}