js 中的错误处理.

 

分为三块吧.

第一:普通的js中 错误处理.

第二: promise 中的错误处理

第三: async 中的错误处理

 

第一: 普通的js 的错误处理 

 说普通是因为比较简单,算一个知识点没有太多啥说的,大家找找资料比较齐全

 

复制代码
https://www.sitepoint.com/exceptional-exception-handling-in-javascript/

 

try{

 

    ...    //异常的抛出}

 

catch(e){

 

    ...    //异常的捕获与处理}

 

finally{

 

    ...    //结束处理}
复制代码

 

第二: promise 中的错误处理

在promise 中处理错误,我们通常也是去try catch,但是 只能catch 到同步的错误,如果是异步的,比如我们settimeout一下其实是catch不到的.来个栗子:

 

复制代码
var promise = new Promise(function(resolve, reject){

 

    setTimeout(function(){

 

        throw new Error('test')

 

    }, 0)

 

    resolve('ok'); //输出

 

});

 

promise

 

    .then(function(value){ console.log(value) })

 

    .catch(()=> console.log('err'))

 

 

 
复制代码

 

栗子

可以看到,只输出了ok,然后浏览器捕获的错误,catch并没有拿到.

 

然后看看我们使用reject 来抛出错误

 

 

 

reject

可以看到,reject 会不停的返回到下一个,但是并不会被catch 到.如果我们试试throw 一个error呢?

 

throw error

通过一层层throw 在catch 里面我们是可以拿到的,疑问来来, 如果是通过 异步promise 里面reject 能catch 到么?

 

 

 

异步

依然是可以拿到的.

 

好啦最后总结一下吧.在promise 中, 如果使用reject 错误,必须要再每个then函数中throw 出去,不然在catch中无法拿到.其实我们不需要再次的throw ,在promise 正常catch 就好,比如在上面的异步中我们reject一下在最后就能catch到. 需要注意的一点就是:promise 中的错误是不会影响外层的运行,window.onerror 也是无法检测到的.

 

 

 

第三: async 中的错误处理

 

async用起来确实方便很多,promise 导致整段代码都是promise 的then ,如果判断太多导致代码逻辑复杂难以维护,而且每个then 都有自己的作用域,如果要贡献数据 通常要在外层新建一个.

 

直接贴代码吧,看看async 正常处理异步的方式

 

复制代码
const f = () => {

 

  return new Promise((resolve, reject) => {

 

    setTimeout(() => {

 

      reject(234);

 

    }, 2000);

 

  });

 

};

 

const testAsync = () => {

 

  try {

 

    const t = await f();

 

    console.log(t);

 

  } catch (err) {

 

    console.log(err);

 

  }

 

};

 

testAsync();
复制代码

 

 

可以看到,可以使用同步的方式来处理error,但是如果判断很多,多个异步又会导致到处都是判断和try catch.因此国外的大神Dima Grossman给出了一个解决方案.直接贴官方的传送门!

 

https://github.com/scopsy/await-to-js

 

 下面这个链接是一位大佬对await to js 使用中的改进.很值得一看,对优化自己的代码和流程很又帮助.

https://segmentfault.com/a/1190000011802045

posted on   ygunoil  阅读(1256)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示