zoukankan      html  css  js  c++  java
  • 异步错误处理

    如何处理异步中的错误?

    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');
        }
    }
    
  • 相关阅读:
    每日一题20180325
    Linux下MySQL表名区分大小写
    CentOS删除编译安装的Python3
    HTTPS配置
    测试 js 方法运行时间(转)
    使用dbutils进行批处理
    oracle生成主键
    JDBC学习笔记(10)——调用函数&存储过程(转)
    easyui Draggable
    blob
  • 原文地址:https://www.cnblogs.com/bonly-ge/p/12930898.html
Copyright © 2011-2022 走看看