异步错误处理

如何处理异步中的错误?

  1. 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,说明捕获到了
  
  1. Promise的错误可以通过catch进行捕获

  2. 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
    
  3. 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');
    }
}
posted @ 2020-05-21 15:06  bonly-ge  阅读(595)  评论(0编辑  收藏  举报