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.pswp.cn/news/396874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396874.shtml
英文地址,請注明出處:http://en.pswp.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…