这篇文章想重温一下使用try...catch进行异常捕获的一些知识点。为了提高大家的阅读兴趣,我们先做三个小练习。如果你都做对了,就说明你对这部分知识很熟练,所以这篇文章就不用看啦~如果做错了题目,说明我们还有一些知识点需要再次巩固。话不多说,先来看看这三个问题:functiondoTask(){try{console.log('1intryblock');抛出“2个测试错误”;返回3;}catch(e){console.log('4incatch块');控制台日志(e);返回5;}finally{console.log('6infinallyblock');返回7;}}//控制台输出的结果是什么?console.log(doTask());functiondoWork(){try{console.log(1);尝试{console.log(2);扔3;}最后{console.log(4);}console.log(5);}catch(e){console.log(e);}}//控制台输出的结果是什么?doWork();functiondoRepeat(){for(leti=0;i<2;i++){try{if(i===1){继续;}console.log(`${i}intry`);}finally{console.log(`${i}infinally`);}}}//控制台的输出是什么?做重复();以上每道题都有自己的小心思,一不小心就很容易出错。大家可以在评论区晒出你们的测试结果。如果你做错了某道题,没关系。通过这篇文章,让我们一起回顾一下相关的知识点。眼见为实,让我们开始吧。各种形式的try/catch/finallytry...catch应该是开发中使用频率最高的形式。当我们需要执行一些可能会抛出错误的方法或语句时,我们会用try将要执行的语句包装起来,然后用catch来捕获相应的异常。形式大致如下:try{//一个有概率抛出异常的操作someErrorProneFn();}catch(e){//打印并上报连接日志logAndReportError(e);}我们也可以判断类型e,然后根据不同的错误类型采取不同的动作。另外需要注意的是catch也可以接收不到异常信息。如下所示:try{//someErrorProneFn()是一个有概率抛出异常的操作;我经常使用它,所以没有什么大问题。尝试...最后尝试{connectChannel();doSomething();}finally{//finallydosomecleanup();}第二种形式是try...finally,估计大家用的比较少;这种形式通常用于执行操作。一般这个操作可能会占用大量内存,或者操作后需要回收内存或者关闭连接或者关闭数据库。但是对于运行过程中出现的异常我们可能不太关注。然后我们可以在操作完成的时候做一些尾部处理。当前try代码块中的异常还是会抛到外面,需要在外面捕获处理。这个知识点和上面的第二个和第三个问题有些关系,后面我们会详细的给大家讲解。try...catch...finally的形式是最完整的异常捕获形式。我们通过try代码块执行容易出错的代码,通过catch代码块捕获异常,根据异常的类型进行不同的处理;最后的操作是通过finally代码块进行的,一般用来做一些清理工作。try...catch...finally我们以这个最全的形式为例,讲解几个核心知识点。try代码块的执行先执行,只有try代码块抛出异常才会进入catch代码块。在try...finally中,如果try块中抛出异常,异常会被外层最近的catch块捕获。finally代码块会一直执行,不管try代码块是否抛出异常,catch代码块是否执行。finally代码块的执行时机:如果try/catch代码块中包含流控语句(例如:return、break、continue、throw),那么finally代码块会先于这些流控语句执行。如果不包含流程控制语句,则在相应代码块执行完毕后开始执行。如果finally代码块中包含流控语句,则首先执行finally代码块的流控语句,然后替换掉原来try/catch中的流控语句。这需要注意。如果上面的文字描述让你理解起来还是有点吃力,那我们可以看看下面我做的流程图,希望能加强你对这块知识的理解。以上知识点非常重要。如果你知道以上知识点,那么以上三个问题对你来说就很容易了。让我们详细解释以上三个问题。第一题先运行doTask函数,进入try块,在try块中打印1;然后执行throw'2testerror',后面的return3不会执行,所以try块只打印try块中的1。因为try块抛出异常,所以会进入catch块,然后在catch块打印4,然后打印e,也就是2测试错误,然后准备开始执行return5,因为return5是流程控制语句,所以接下来开始执行下面的finally块。然后在finally块中打印6,因为这个finally块中包含了流控语句,所以会替换掉catch中的return5。最后打印doTask函数的返回值:7,所以最终计算输出为:1intryblock4incatchblock2testerror6infinallyblock7第二题运行doWork函数,进入try块,开始打印:1;进入内部try块,打印:2;在开始执行throw3之前,因为throw3是一个流控语句,所以先运行finally块中的语句,print:4;然后开始执行throw3,后面的console.log(5)不执行To,直接跳过。异常被最近的outercatch捕获,打印:3。所以最终计算输出为:1243第三题运行函数doRepeat,进入第一个循环,i的值为0;执行第一个循环try/finally块,所以先在try中打印:0,然后在finally中打印:0;第二次循环,在try块中遇到continue,因为continue是一个流控语句,所以先执行finally块中的语句,打印finally中的:1;然后执行continue,循环结束。所以最后的计算输出是:0intry0infinally1infinally前端这么厚。关于try/catch/finally的内容到此结束。如果您有什么建议和意见,欢迎在文章下方评论留言;如果您觉得本文对您有帮助,请点赞转发,我们下期再见。参考链接:异常处理语句try...catch
