c++ try catch语句_再问你一遍,你真的了解try..catch(finally)吗???

定义

首先来看下 MDN 的定义:

The try...catch statement marks a block of statements to try and specifies a response should an exception be thrown.
try...catch语句标记要执行的语句,并指定一个当有异常抛出时候的响应

简短的一句的确描述了try...catch的大部分功能。

但是,最MDN的最后,有一段话是这么写的:

Returning from a finally-block
If the finally-block returns a value, this value becomes the return value of the entire try-catch-finally statement, regardless of any return statements in the try and catch-blocks. This includes exceptions thrown inside of the catch-block:
finally语句块的返回值
如果finally语句块中有返回值,那么这个值将作为整个try...catch语句的返回,无论try语句块或者catch语句块中是否有返回,这包括了catch中的异常。

ok,那我们就尝试加上return,看看会发生什么。

case1

输入

function fn() {try {console.log('try块内log');} catch (error) {console.log('catch块内log');} finally {console.log('finally块内log====');}return '一般情况下的return';
}
console.log(fn());

输出:

v2-78f6b6985fed716dd79388dad17bf815_b.jpg

一切看起来都如我们所想,没有问题,继续往下看。

case2

输入

function fn() {try {console.log('try块内log');return 'try中的return'; // <=== 多了这么一句} catch (error) {console.log('catch块内log');return 'catch中的return语句';} finally {console.log('finally块内log====');}return '一般情况下的return';
}
console.log(fn());

输出

v2-fe1893a4ddd0dfd4e2d6a5630c8dc429_b.jpg

正如上图所示,这里打印的是try的return,但是,finally语句块中的log依然被执行了。 看到这里,我们可以知道,finally的执行时机是在try(或者cache,cache同理)执行return之前被执行。 那我们就可以验证下MDN上所说的:finally语句块的返回值 这句话的真正含义。

case3

输入

function fn() {try {console.log('try块内log');return 'try中的return'} catch (error) {console.log('catch块内log');return 'catch中的return语句';} finally {console.log('finally块内log====');return 'finaly中的return'; // <=== 多了这么一句}return '一般情况下的return';
}
console.log(fn());

输出

v2-b1592a772983d91b8bc4e1e0659fcc57_b.jpg

ok,依然很正常,因为finally会在try的return之前执行,所以拦截了try中的return,打印了finally中的return

你以为这样就结束了吗?

我们继续往下看。

case4

输入

function justLog(){console.log('来自justLog的打印');return '来自justLog的return'
}function fn() {try {console.log('try块内log');return justLog(); // <=== 这次我们return了一个函数} catch (error) {console.log('catch块内log');return 'catch中的return语句';} finally {console.log('finally块内log====');return 'finaly中的return';}return '一般情况下的return';
}
console.log(fn());

先思考一下会打印什么?看看是否和真实的输出一致。给我们几秒钟...

----

----

----

小小的声援一下,希望战'役'早日胜利。加油! 然后: 我会长期更新有趣的,有料的前端知识,如果对你有帮忙,请关注我,日后接受第一手更新消息。非常感谢

v2-cab018acd31efc0234f55a1836c7930b_b.jpg

----

----

----

输出

v2-be57f66caf60f4c5636c765884635a59_b.jpg

你答对了没有? 可以看到,红框内为justLog函数的log,红框下面是finally中的打印和返回。 所以finally真正的执行时机是:try(或catch)中 return关键字之前。 所以我们才看到了justLog中的打印。 有关return关键字的实现,可以自行查询标准,这里不赘述。

应用场景

比如我们有这样一个高阶函数:

function hoc(fn) {return fn()
}

我们想要返回所传递参数的执行结果,这样做是没问题的。

那如果我们想在函数执行之后,return之前,做一些其他操作,应该怎么做呢?

function hoc(fn) {const res = fn();// 其他操作return res;
}

很简答,我们可以先获取返回值,再进行其他操作,然后return。 不过这样我们就占用了额外的空间,而且无法便利的复用return后的语句,这个时候,我们的try...catch就可以排上用场了:

function hoc(fn) {try {return fn();} finally {// 一些其他操作,这些操作会在 `fn()执行后,return执行前` 被执行}
}

总结

大白话来讲,finally语句块会在try(或catch)中的 return 关键字之前执行。一图以概之:

v2-9b2899916d4478e66c6bb0426a2db8a4_b.jpg

最后,如果有帮到你的地方,欢迎关注、交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lamp架构,搭建一个网络平台

首先更改主机名和 hosts 安装软件包&#xff0c;设置启动服务 设置数据库密码 上传discuz论坛包 将discuz注册的用户名写在mariadb数据库中 解压discuz包 unzip discuz包 -d /var/www/html cd到upload下 cp -rf * /var/www/html 进入数据库 mysql -uroot -p create database…

MyEclipse中SVN的使用方法

1、 加载插件 svn-myeclipse插件site-1.10.2.zip&#xff0c;解压缩后&#xff0c;将文件夹下的所有文件拷贝到MyEclipse安装包下的MyEclipse 8.5\dropins文件夹下&#xff0c;然后重新打开myeclipse&#xff0c;会弹出一个报错窗口&#xff0c;不要管它&#xff0c;关闭后&…

oracle数据泵导出csv文件,数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理...

使用数据泵导出数据库数据时&#xff0c;发现如下错误提示&#xff1a;ORA-31693: Table data object "CAMS_CORE"."BP_EXCEPTION_LOG" failed to load/unload and is being skipped due to error:ORA-02354: error in exporting/importing dataORA-01555:…

Go程序开发---Go环境配置:CentOS6.5+Go1.8标准包安装

1.Go安装 1.1Go的三种安装方式 Go有多种安装方式&#xff0c;可以选择自己习惯的方式进行&#xff0c;这里介绍三种安装方式&#xff1a; 1&#xff09;Go源码安装 2&#xff09;Go标准包安装 3&#xff09;第三方工具安装 这里主要介绍下Go标准包在CentOS6.5系统中的安装方式 …

python矩阵乘法_鱼书——第一章 Python入门

one 第一章1.1 Python是什么Python是一个简单、易读、易记的编程语言&#xff0c;而且是开源的&#xff0c;可以免费地自由使用。Python可以用类似英语的语法编写程序&#xff0c;编译起来也不费力&#xff0c;因此我们可以很轻松地使用Python。特别是对首次接触编程的人士来说…

深入浅出面向对象分析与设计

深入浅出面向对象分析与设计书籍 下载位置&#xff1a;http://pan.baidu.com/s/1o7gmmuu转载于:https://www.cnblogs.com/wlming/p/5160140.html

[SHOI2002]百事世界杯之旅

题目&#xff1a;“……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字&#xff0c;就可参加百事世界杯之旅的抽奖活动&#xff0c;获得球星背包&#xff0c;随声听&#xff0c;更克赴日韩观看世界杯。还不赶快行动&#xff…

Oracle adviser,Oracle10g SQL tune adviser

Oracle10g SQL tune adviser简单介绍本文简单介绍下SQL Tuning Adviser的配置使用方法和一些相关知识点&#xff0c;如果了解SQL Tuning Adviser详细信息&#xff0c;参看Oracle联机文档。本文对分析结果没有详细分析。一、自动SQL Tuning简单介绍&#xff1a;1、优化模式&…

考托福

todo 香港的博士 转载于:https://www.cnblogs.com/dunfentiao/p/5164028.html

keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?

背景介绍OpenStack环境Neutron 的安全组会向虚拟机默认添加 anti-spoof 的规则&#xff0c;将保证虚拟机只能发出&#xff0f;接收以本机Port为原地址或目的地址(IP、MAC)的流量&#xff0c;提高了云的安全性。但是LVS等需要绑定VIP的场景&#xff0c;默认流量是被拦截的。需要…

Docker安装ssh,supervisor等基础工具

2019独角兽企业重金招聘Python工程师标准>>> Docker安装ssh&#xff0c;supervisor等基础工具 需要提前下载好官方的ubuntu镜像&#xff0c;我这里使用的是ubuntu:14.04版本&#xff0c;这里安装了一些基础的工具ssh&#xff0c;curl&#xff0c;wget&#xff0c;vi…

中南大学 oracle试卷,数据库原理期末复习(中南大学)数据库原理、技术及应用2.ppt...

2014 春季 信息11,12 DB P,T&A-张祖平 数据库原理、技术及应用 张祖平/Zhang Zuping 电子信息工程系 School of Information Science and Engineering,Central South University , zpzhangmail.csu.edu.cn 本章小结 关系模型中的相关概念 关系(集合)&#xff0c;性质&#…

Pandas时间差(Timedelta)

时间差(Timedelta)是时间上的差异&#xff0c;以不同的单位来表示。例如&#xff1a;日&#xff0c;小时&#xff0c;分钟&#xff0c;秒。它们可以是正值&#xff0c;也可以是负值。可以使用各种参数创建Timedelta对象&#xff0c;如下所示 - 字符串 通过传递字符串&#xff0…

nginx集群_windows环境下搭建简单Nginx+Tomcat集群

通俗点将&#xff0c;负载均衡就是因为访问流量太大&#xff0c;导致项目访问不流畅、甚至宕掉&#xff0c;所以通过一种分流的方式来缓解这种情况。一、 工具nginx-1.8.0apache-tomcat-6.0.33二、 目标实现高性能负载均衡的Tomcat集群&#xff1a;三、 步骤1、首先下载Nginx&a…

颜色传感器TCS230及颜色识别电路(转)

摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器。该传感器具有分辨率高、可编程的颜色选择与输出定标、单电源供电等特点&#xff1b;输出为数字量&#xff0c;可直接与微处理器连接。文中主要介绍TCS230的原理和应用&#xff0c;以及色光和白平衡的知识&…

自定义对话框 提示:Unable to add window token null is not for an application

这是因为在new Dialog(context);的时候传入的context是通过getApplicationContext()获得的&#xff0c;这样就会报错。 把context的获得方式改为MainActivity.this就好了。 转载于:https://www.cnblogs.com/qlong8807/p/5167560.html

[51Nod 1218] 最长递增子序列 V2 (LIS)

传送门 Description 数组A包含N个整数。设S为A的子序列且S中的元素是递增的&#xff0c;则S为A的递增子序列。如果S的长度是所有递增子序列中最长的&#xff0c;则称S为A的最长递增子序列&#xff08;LIS&#xff09;。A的LIS可能有很多个。例如A为&#xff1a;1 3 2 0 4&#…

linux如何全局搜索目录,Linux 全目录全文搜索

文件内容搜索1grep -r root /home/ray/dev/media/wyquery/*通过这种方法来寻找数据库配置文件的目录其他$ grep “被查找的字符串” 文件名例子&#xff1a;在当前目录里第一级文件夹中寻找包含指定字符串的.in文件grep “thermcontact” */*.in从文件内容查找与正则表达式匹配…

mysql命令行导入和导出数据

首先打开命令窗口,输入命令:mysql -h localhost -u selffabu -p 连接成功后,进行下面的操作 MySQL中导出CSV格式数据的SQL语句样本如下&#xff1a; Sql代码select * from test_info into outfile /tmp/test.csv fields terminated by , optionally enclosed by " esc…

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象&#xff0c;不会拷贝对象的内部的子对象。2. copy.deepcopy 深拷贝 拷贝对象及其子对象 一个很好的例子&#xff1a; 1 import copy2 a [1, 2, 3, 4, [a, b]] #原始对象3 4 b a #赋值&#xff0c…