關於C++的異常拋出

来源:https://www.cnblogs.com/CooCoChoco/archive/2020/03/15/CooCoChoco.html
-Advertisement-
Play Games

在接觸 throw 之前,我們只知道可以通過函數的返回值來獲取和定位錯誤,比如通過 return 來層層返回是一種方法,但如果牽扯到多層函數調用,那麼通過 return 來返回錯誤顯得過於拖沓,這時就應該用到 throw 這個方法,throw 的靈活強大將在下邊詳細說說。 首先是 throw 的三個 ...


在接觸 throw 之前,我們只知道可以通過函數的返回值來獲取和定位錯誤,比如通過 return 來層層返回是一種方法,但如果牽扯到多層函數調用,那麼通過 return 來返回錯誤顯得過於拖沓,這時就應該用到 throw 這個方法,throw 的靈活強大將在下邊詳細說說。

 

首先是 throw 的三個關鍵字:

throw:這是個拋出的關鍵字,就像是return一樣,他可以給上一層的調用者返回一個異常,拋出的異常可以是常見的類型,如int,char,指針,結構體甚至是類。

try:來捕獲異常,try的作用域(這個作用域叫做保護段)中將會包含擁有throw的函數,如果沒有拋出異常,代碼將會一直執行下去並跳出 try

catch:catch用來輸出異常,他通常跟在 try 之後,如果在try後跟著多個catch,也只會輸出一個catch,拋出來的異常將會找到合適的類型進行輸出,輸出後將不會再進入其他catch輸出,如果找不到合適的類型的 catch 編譯將會報錯。

 

下麵是一個基本的代碼例子,說明 throw、trycatch的基本用法,與 catch 的類型自動匹配:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int test_1(int num)
 7 {
 8     if (num != 0)
 9     {
10         throw - 1;                                //拋出一個int類型的異常,如果 30 行傳1過來,那麼將會拋出該異常至36行的 try
11     }
12     else {
13         throw new string("拋出字元串異常");         //拋出一個字元串異常,如果 30 行傳0過來,那麼將會拋出該字元串異常,catch將會匹配42行
14     }
15 
16     return 0;
17 }
18 
19 int test_2(int num)                                //函數進行了嵌套
20 {
21     test_1(num);
22     return 0;
23 }
24 
25 int main()
26 {
27     int ret = 0;
28     try                                                     //try中的方法的返回值會被下邊的catch捕捉
29     {
30         ret = test_2(1);                                    //傳1過去,將會捕獲test_1中的throw -1,將會直接跳出至41行。
31     }
32     catch (int error) {                                    //捕捉到的值會傳到 error 變數
33         printf("出現異常了!%d\n", error);
34     }
35     catch (string * error)
36     {
37         printf("捕捉到字元串異常:%s", error->c_str());        //如果30行傳過去的是0,可以通過拋出的異常來找合適的類型 string
38         delete error;
39     }
40     catch (...) {                                            //如果沒有合適的類型將會進入這裡的通配,如果沒有這行通配,你試著傳個浮點型過來,編譯不會過的。
41         printf("catch...\n");
42     }
43 
44     return 0;
45 }

 

 

這裡在說一下拋出被攔截的情況,同樣是上邊的代碼:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int test_1(int num)
 7 {
 8     if (num != 0)
 9     {
10         throw - 1;                                  //拋出一個int類型的異常,返回到 20 行
11     }else{
12         throw new string("拋出字元串異常");
13     }
14 
15     return 0;
16 }
17 
18 int test_2(int num)
19 {
20     try                                            //如果這裡捕獲異常,第38行中的 try 將捕獲不到test_1的異常
21     {
22         test_1(num);
23     }
24     catch (...) {
25         printf("test_2 異常拋出");
26         throw 0.01;
27     }
28 
29     /* throw */
30     //這裡如果再 throw ,38行將會再次接收到 test_1 的異常
31 
32     return 0;
33 }
34 
35 int main()
36 {
37     int ret = 0;
38     try
39     {
40         ret = test_2(1);                                    //傳1過去,將會拋出 test_1 中的 throw -1
41     }
42     catch (int error) {
43         printf("出現異常了!%d\n", error);        
44     }
45     catch (string * error) 
46     {                        
47         printf("捕捉到字元串異常:%s", error->c_str());
48         delete error;
49     }
50     catch (...) {
51         printf("catch...\n");
52     }
53 
54     return 0;
55 }

 

待續……


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 HTML 中,某些字元是預留的。在 HTML 中不能使用小於號(<)和大於號(>),這是因為瀏覽器會誤認為它們是標簽。如果希望正確地顯示預留字元,我們必須在 HTML 源代碼中使用字元實體(character entities)。 字元實體類似這樣: &entity_name; 或者 &#ent ...
  • 公司千萬級用戶應用繼續上新功能了,這次新功能主要迭代是小程式,讓小程式支持發佈商品功能,這是封裝weui上傳組件的原因,又是因為工作才去做的事情,我真是個不主動學習的人,先自責一下;這次記錄主要是考慮到其中的實現有很多小程式開發的細節,實現方案比較low,但是還是記一下這個上傳圖片+視頻的組件,其它 ...
  • 在網上看到一些朋友在查詢如何在電腦上下載tumblr(湯不熱)視頻,而本文將要介紹的「Tumblr.iiiLab.com」是一個免費的tumblr(湯不熱)線上視頻下載網站,下載方法很簡單,只需將視頻鏈接複製、粘貼到查詢框中,點擊查詢按鈕,然後就可快速保存mp4視頻到你PC或手機中。 網站訪問鏈接: ...
  • 記錄大話設計學習過程。 “工廠模式”和“簡單工廠模式”的區別就是把“到底實例哪一個對象的判斷邏輯”遷移出去。因為,如果是簡單工廠,哪天增加了新的運算,就必須修改簡單工廠類的判斷分支,這違反了“開放-封閉原則”。 現在判斷邏輯依然有,只是放在了客戶端,如果哪天增加新的運算,如果使用工廠模式,擴展就通過 ...
  • 在「 如何建立架構師的立體化思維? 」這篇文章中,老兵哥 跟大家一起聊到架構設計涉及業務、技術、系統和時間等幾個維度,也知道從技術維度可以將應用分成七層,那具體怎麼做呢?今天我們繼續來聊聊分層架構的設計流程,以及介面設計方法等內容。 ...
  • 程式名稱:功夫滑鼠KongFuMouse聯繫郵箱:[email protected]工程版本:Ver0.1.9版本狀態:工程版本,尚未發佈,敬請期待! 軟體介紹: 還在為一些固定化滑鼠點擊煩惱?還在為頻繁點擊滑鼠點擊煩惱?功夫滑鼠解放您的雙手!!!功夫滑鼠2020是一款功能強大的滑鼠自動執行軟體(滑鼠自動 ...
  • 原文鏈接:http://www.yiidian.com/servlet/servlet dispatcher.html 使用Servlet請求轉發與包含 RequestDispatcher介面提供了將請求轉發到另一個資源的功能,該資源可能是Html,Servlet或Jsp。該介面還可以用於包含其他資 ...
  • 格式: static { } 特點:隨著類的載入而執行,只執行一次,並優先於主函數。 用於給類進行初始化的。 一個類可以寫多個靜態代碼塊。 創建一個指向null的引用變數不會觸發static代碼塊。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...