C++ 例外處理 try throw catch

例外處理

程式中可能會發生的錯誤有三種,分別是語法錯誤(syntax error) 、執行期間錯誤(runtime error) 及語意錯誤(semantic error) ,其中編譯器會直接檢查出語法錯誤,如果含有語法錯誤的程式無法過編譯,例如

$ g++ u06.cpp
u06.cpp:4:14:錯誤:聲明末尾應有“;”int a = 12^;
生成 1 個錯誤。
$

u06.cpp檔案中漏打一個分號,編譯器挑出錯誤并印出相關資訊。

語意錯誤比較麻煩,若一個程式中有語意錯誤,這個程式可以順利通過編譯,卻會跑出非預期的結果。有語意錯誤的程式必須重新檢查程式的邏輯,手動找出錯誤并修正錯誤,因此大型軟體通常依功能拆分成各個小模組,每個小模組都分開測試,都測試無誤后才重新整合為單一軟體。

至于執行期間錯誤通常不是程式邏輯的問題,像是存檔時檔案不存在或是儲存空間不夠都會造成發生錯誤,這些錯誤發生的原因都不是程式的問題。因此C++ 提供一套例外處理(exception handling) 的機制,讓我們寫程式可以檢查執行期間錯誤。

下面我們分成數個部分介紹C++ 的例外處理

try throw catch?

例外處理為控制程式發生錯誤后的機制, C++ 使用try、throw與catch三個關鍵字(keyword) 進行例外處理。

try后面的大括弧用來放可能會發生錯誤的程式碼,在會發生錯誤的地方用throw丟出例外(exception) ,catch依據例外的型態(type) 進行處理。舉例如下

#include <iostream>int main() {int i = -1; try {if (i < 0) {throw "something wrong...";}}catch (const char* message) {std::cout << message << std::endl;}return 0;
}

假設i小于0會發生錯誤,因此檢查i是否小于0,如果小于0就用throw丟出"something wrong..."的例外

try {if (i < 0) {throw "something wrong...";}
}

對應到catch的部份,例外型態就是const的字元指標(pointer)

catch (const char* message) {std::cout << message << std::endl;
}

意思就是抓到字串(string) 的例外型態,因為throw后面就是丟出字串。

編譯執行,結果如下

$./a.out 復制代碼
有事嗎...
$

例外的型態可以是標準程式庫(standard library) 中的型態,或是自訂的型態,例如

#include <iostream>struct BadValue : public std::exception {};double divide(double a, double b) {if (b == 0) {throw BadValue();}return a / b;
}int main() {try {std::cout << divide(20, 5) << std::endl;std::cout << divide(20, 4) << std::endl;std::cout << divide(20, 3)  << std::endl;std::cout << divide(20, 2) << std::endl;std::cout << divide(20, 1) << std::endl;std::cout << divide(20, 0) << std::endl;}catch (BadValue e) {std::cout << "something wrong..."  << std::endl;}return 0;
}

這里的BadValue繼承自標準程式庫中的exception

struct BadValue : public std::exception {};

由于除法在分母為0時無法計算,因此在divide()?函數(function) 中遇到分母為0時就throw出一個例外

double divide(double a, double b) {if (b == 0) {throw BadValue();}return a / b;
}

try部份的程式碼會逐一執行,碰到發生例外就會跳到catch的部份,編譯執行結果如下


$ g++ u0601_2.cpp
$./a.out 復制代碼
4
5
6.66667
10
20
有事嗎...
$

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43881.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PythonRS】基于Python分塊處理大型遙感影像的方法

RSer工作時不可避免會用到大型的遙感影像,由于分辨率過高、區域過大、波段信息過多等原因,都會導致數據非常的大。這個時候我們在進行一些簡單的操作,如計算NDVI、二值化、分類等時,計算機的內存都會溢出。因此今天跟大家分享一下我平時分塊的方法,中間如何計算就按照自己…

Docker 使用基礎(3)—容器

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━?&#x1f49f;──────── 4:20 &#x1f504; ?? ? …

let/const/var的區別及理解

在JavaScript中&#xff0c;let、const 和 var 是用來聲明變量的關鍵字&#xff0c;但它們之間在作用域、變量提升、重復聲明等方面存在區別&#xff0c;詳細情況如下: 1. let、const、var 的區別 (1) 塊級作用域 let 和 const&#xff1a;具有塊級作用域&#xff0c;由 {} 包…

百數教學秘籍:三步走,輕松規劃你的自動化計劃任務

通過設定任務計劃&#xff0c;用戶可以輕松安排指定的功能插件或數據助手在特定時間自動執行&#xff0c;有效提高工作效率&#xff0c;還確保了數據的及時更新和處理。任務計劃在應用啟動時自動啟動并在后臺運行&#xff0c;無需用戶持續監控&#xff0c;為用戶帶來極大的便利…

oracle哪些后臺進程不能殺?

oracle 有很多的后臺進程&#xff0c;在遇到特殊情況的時候如鎖表&#xff0c;如果等待的是一個后臺進程&#xff0c;那這時就需要考量是不是能殺掉這個后臺進程&#xff1f;殺掉這個后臺進程會不會引起實例崩潰&#xff1f;本著實踐出真知&#xff0c;本文針對oracle 11g&…

游戲開黑語音-使用云服務器部署teamspeak服務(系統Ubuntu 20.04 LTS)

目錄 前置物品服務器調整及部署1.重裝系統2.換源3.下載teamspeak服務端并部署 連接服務器參考 前置物品 一臺云服務器&#xff08;系統&#xff1a;Ubuntu 20.04 LTS) 服務器調整及部署 1.重裝系統 在騰訊云官網的主機控制臺內&#xff0c;選擇重裝系統 (由于之前為了快點和…

【刷題匯總 -- 最長回文子串、買賣股票的最好時機(一)、[NOIP2002 普及組] 過河卒】

C日常刷題積累 今日刷題匯總 - day0101、最長回文子串1.1、題目1.2、思路1.3、程序實現 2、買賣股票的最好時機(一)2.1、題目2.2、思路2.3、程序實現2.4、程序實現 -- 優化 3、[NOIP2002 普及組] 過河卒3.1、題目3.2、思路3.3、程序實現 -- dp 4、題目鏈接 今日刷題匯總 - day0…

Excel中用VBA實現Outlook發送當前工作簿

Excel中用VBA實現Outlook發送當前工作簿&#xff0c;首先按AltF11打開VBA編輯器&#xff0c;插入模塊&#xff0c;并在工具-引用中勾選 Microseft Outlook .0 Object Library(其中為你Microseft Outlook的版本號。 Sub 發送郵件() 保存當前excel ThisWorkbook.Save讓excel連接…

Linux 入門教程 by 程序員魚皮

本文作者&#xff1a;程序員魚皮 免費編程學習 - 編程導航網&#xff1a;https://www.code-nav.cn 大家好&#xff0c;我是魚皮。 前兩天我學編程的老弟小阿巴過生日&#xff0c;我問他想要什么禮物。 本來以為他會要什么游戲機、Q 幣卡、鼠標鍵盤啥的&#xff0c;結果小阿巴…

模擬防止重復提交

gitee地址&#xff08;需要自取&#xff09;AopProxy重復提交: 防止重復提交 (gitee.com) RestController public class SubmissionController {Autowiredprivate SubmissionService submissionService;private static Jedis jedis new Jedis("localhost",6379);pr…

短視頻矩陣:批量發布的秘密揭秘

在數字化時代&#xff0c;短視頻已經成為一種廣受歡迎的媒體形式。無論是用于品牌推廣、產品營銷還是個人創作&#xff0c;短視頻都提供了一種直觀、生動的方式來吸引觀眾的注意力。然而&#xff0c;有效地制作、管理和發布短視頻對于許多創作者和企業來說是一個挑戰。 為此&am…

什么是 C 語言中的宏定義?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01; &#x1f4d9;C 語言百萬年薪修煉課程 通俗易懂&#xff0c;深入淺出&#xff0c;匠心打磨&#xff0c;死磕細節&#xff0c;6年迭代&#xff0c;看過的人都說好。 文章目…

解決 Yarn 運行時的 Node.js 版本問題:一個詳盡的指南

引言 Yarn 是一個流行的 JavaScript 包管理器&#xff0c;它與 Node.js 緊密集成&#xff0c;用于管理項目依賴。然而&#xff0c;在開發過程中&#xff0c;開發者可能會遇到 Node.js 版本不兼容的問題&#xff0c;這會導致 Yarn 運行時出錯。本文將提供一個詳細的指南&#x…

動態規劃之數字三角形模型+最長上升子序列模型

首先&#xff0c;我們從集合角度重新看待DP&#xff1a; 直接看題&#xff1a;https://www.acwing.com/problem/content/1029/ 就是取紙條的原題&#xff0c;我們令f[i1,j1,i2,j2]表示從(1,1),(1,1)分別走到(i1,j1),(i2,j2)的路徑的max i1j1i2j2&#xff0c;于是我們可以把狀…

機器學習 | 對K-Means聚類假設的研究演示及實踐示例

我們在Scikit-learn對K-means假設的調查中探索了揭示算法優勢和局限性的場景。我們研究了K-means對不正確的聚類大小的敏感性&#xff0c;它在各向異性分布中面臨的困難&#xff0c;它在不同的聚類方差中面臨的困難&#xff0c;以及使用合成數據集的大小不均勻的聚類問題。我們…

準備工作+1、請求和響應+2、模型和管理站點

Django快速入門——創建一個基本的投票應用程序 準備工作1、創建虛擬環境2、安裝django 1、請求和響應&#xff08;1&#xff09;創建項目&#xff08;2&#xff09;用于開發的簡易服務器&#xff08;3&#xff09;創建投票應用&#xff08;4&#xff09;編寫第一個視圖1、編寫…

家用激光投影儀品牌排行榜:這幾個品牌口碑好產品好最適合家用

現在人們生活水平提升&#xff0c;對投影這類產品的認知接受度也提升&#xff0c;有條件的家庭都想在家里整一個家庭影院&#xff0c;對于這些消費者來說挑選一臺性價比高的家用投影至關重要&#xff0c;既省到錢又買對了產品&#xff1b;投影市場發展迅速目前市面上大大小小的…

華為機考真題 -- 多段線數據壓縮

題目描述: 下圖中,每個方塊代表一個像素,每個像素用其行號和列號表示,但可以發現,這種表示不是最簡的,其實只需要存儲 6 個藍色的關鍵點即可,它們是線段的起點、拐點、終點,而剩下 4 個點是冗余的。現在,請根據輸入的包含有冗余數據的多段線坐標列表,輸出其最簡化的…

mongo數據庫遷移

前言 mongo數據庫遷移的方式目前常見的有兩種&#xff1a; 1&#xff0c;mongodump與mongorestore 2&#xff0c;mongoimport與mongoexport 二者主要區別有&#xff1a; 1、mongoexport 可以導出json和csv格式&#xff0c; mongodump導出的是bson可讀性不如前者 2&#xff0c;…

在Windows 10上快速顯示桌面的幾種方法,總有一種適合你

序言 有時你需要在Windows 10中快速查看你的桌面,但你不想乏味地最小化每個打開的應用程序窗口,或者移動它們并丟失它們的布局。幸運的是,有幾種方法可以讓你快速查看桌面,然后從你停止的地方重新開始。 如何使用任務欄按鈕顯示桌面 假設你正在隨意瀏覽你最喜歡的網站,…