C++中的異常處理機制:try-catch

一、基本概念

異常(Exception):程序執行過程中發生的非正常情況,比如除以零、訪問越界、內存不足等。

異常處理(Exception Handling):對異常情況進行捕獲、分析,并采取補救措施,防止程序崩潰。

C++ 采用 try-catch 語句塊配合 throw 來實現異常處理:
try 塊:放置可能拋出異常的代碼。
throw:用于拋出異常對象。
catch 塊:用于捕獲異常并處理。

二、語法結構

try {// 可能拋出異常的代碼if (something_wrong) {throw exception_object;  // 拋出異常}
}
catch (ExceptionType1 e1) {// 處理 ExceptionType1 類型的異常
}
catch (ExceptionType2 e2) {// 處理 ExceptionType2 類型的異常
}
catch (...) {// 捕獲所有未明確捕獲的異常
}

throw 后面可以是任意類型:內置類型(如 int)、字符串、用戶自定義類等。
catch 塊會根據異常的類型選擇匹配的處理器。
catch (…) 是通配符,表示捕獲所有未被前面 catch 捕獲的異常。

注:

  1. 推薦拋出類或結構體:最好拋出異常類,而不是基礎類型,比如用 std::runtime_error、std::invalid_argument、std::out_of_range 等。
  2. 按引用捕獲:為了避免拷貝,catch 中最好用引用捕獲異常。
  3. 異常必須處理:如果異常未被捕獲,程序會調用 std::terminate(),導致程序異常終止。
  4. 嵌套異常與重新拋出:可以在 catch 里再次 throw 把異常往外傳遞。

三、異常示例

小試牛刀:
#include <iostream>
#include <stdexcept>  // 引入標準異常頭文件using namespace std;int divide(int a, int b) {if (b == 0) {throw runtime_error("Division by zero!");  // 拋出標準運行時異常}return a / b;
}int main() {try {int result = divide(10, 0);  // 這里會拋出異常cout << "Result: " << result << endl;} catch (const runtime_error& e) {  // 用引用捕獲標準異常cout << "Caught exception: " << e.what() << endl;}cout << "Program continues..." << endl;return 0;
}

輸出結果:
在這里插入圖片描述

工程中常見的處理
#include <iostream>
#include <stdexcept>
#include <string>using namespace std;// 錯誤碼枚舉
enum class ErrorCode {InvalidArgument = 1001,ZeroValue = 1002,OutOfRange = 1003
};// 自定義異常類
class MyError : public exception {
private:string message;ErrorCode code;string file;int line;public:MyError(const string& msg, ErrorCode c, const string& f, int l): message(msg), code(c), file(f), line(l) {}// 重寫 what() 方法,返回錯誤信息const char* what() const noexcept override {return message.c_str();}ErrorCode getCode() const noexcept {return code;}const string& getFile() const noexcept {return file;}int getLine() const noexcept {return line;}
};// 用宏封裝 throw,自動帶文件名和行號
#define THROW_MYERROR(msg, code) throw MyError(msg, code, __FILE__, __LINE__)// 拋異常的函數
void doSomething(int value) {if (value < 0) {THROW_MYERROR("Value must be non-negative!", ErrorCode::InvalidArgument);} else if (value == 0) {THROW_MYERROR("Value must not be zero!", ErrorCode::ZeroValue);} else if (value > 100) {THROW_MYERROR("Value out of valid range!", ErrorCode::OutOfRange);}cout << "doSomething succeeded." << endl;
}int main() {try {doSomething(-5);  // 會觸發 InvalidArgument}catch (const MyError& e) {cout << "Caught MyError: " << e.what() << endl;cout << "Error code: " << static_cast<int>(e.getCode()) << endl;cout << "File: " << e.getFile() << endl;cout << "Line: " << e.getLine() << endl;}cout << "Program continues..." << endl;return 0;
}

輸出結果:
在這里插入圖片描述

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

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

相關文章

如何從 Windows 11 或 10 遠程訪問 Ubuntu 24.04 或 22.04 桌面

了解如何使用 RDP(遠程桌面協議)從 Windows 11 或 10 遠程連接 Ubuntu 24.04 Noble 或 22.04 LTS Jammy JellyFish 桌面的步驟。 Windows 提供了一個便捷的功能,稱為遠程桌面連接,它使用 RDP 協議來遠程連接 PC。當從 Windows 系統建立遠程桌面連接時,使用起來非常簡單,…

Linux 服務器中,Tab 鍵自動補全功能失效

在 Linux 服務器中&#xff0c;Tab 鍵自動補全功能失效通常與 bash-completion 組件缺失或配置異常有關。以下是解決問題的兩個關鍵 YUM 指令及操作步驟&#xff1a;1. 安裝 bash-completion 組件 sudo yum install -y bash-completion說明&#xff1a; bash-completion 是提供…

SpringBoot服裝推薦系統實戰

Spring Boot 服裝推薦系統實例 以下是基于Spring Boot實現的服裝推薦系統的30個實例代碼示例,涵蓋核心功能和實現方法。 用戶注冊與登錄功能 @RestController @RequestMapping("/api/auth") public class AuthController {@Autowiredprivate UserService userSer…

WIN10系統優化篇(一)

你是否疑惑為什么別人家的電腦運行速度飛快&#xff0c;而自己的卻卡頓難用&#xff1f;其實&#xff0c;很多時候 Windows 系統可以通過簡單的優化措施來提升使用體驗。本文根據項目實戰多年對 Win10 優化經驗&#xff0c;將幫你找出系統卡頓的原因&#xff0c;并給出針對性的…

Flutter狀態管理篇之ChangeNotifier基礎篇(一)

目錄 前言 一、什么是ChangeNotifier 二、ChangeNotifier 的基本用法 三、結合Flutter UI 使用 四、結合 Provider 的高級用法 五、ChangeNotifier 的優勢與注意事項 5.1 優勢 5.2 注意事項 六、與 ValueNotifier 的比較 七、實際應用場景 八、總結 前言 在 Flutter…

react17更新哪些新特性

React 17 是一個“無新特性”的發布版本&#xff0c;它的主要目標是為未來的 React 版本打好基礎&#xff0c;同時改善與舊版本共存和升級的體驗。雖然沒有引入新的開發者 API&#xff0c;但它在內部做了很多重要的改進。以下是 React 17 的核心更新內容和特性&#xff1a;&…

Unity 常見數據結構分析與實戰展示 C#

Unity 常見數據結構分析與實戰展示 提示&#xff1a;內容純個人編寫&#xff0c;歡迎評論點贊&#xff0c;來指正我。 文章目錄Unity 常見數據結構分析與實戰展示1. 引言2. Unity 數據結構概述3. 常見數據結構1. 數組&#xff08;Array&#xff09;2. 列表&#xff08;List&…

【Linux網絡編程】應用層協議 - HTTP

目錄 初識HTTP協議 認識URL HTTP協議的宏觀格式 Socket封裝 TcpServer HttpServer 整體設計 接收請求 web根目錄與默認首頁 發送應答 完善頁面 HTTP常見Header HTTP狀態碼 HTTP請求方法 cookie與session Connection 抓包 初識HTTP協議 應用層協議一定是基于…

技術演進中的開發沉思-36 MFC系列: 對話框

MFC這個章節里&#xff0c;不能忽視的是對話框的開發。如果把 MFC 程序比作一棟辦公樓&#xff0c;那對話框就是「會客室」—— 它是程序與用戶面對面交流的地方&#xff1a;用戶在這里輸入數據&#xff0c;程序在這里展示信息&#xff0c;彼此的互動都從這個空間開始。今天圍繞…

(李宏毅)deep learning(五)--learning rate

一&#xff0c;關于learning rate的討論&#xff1a;&#xff08;1&#xff09;在梯度下降的過程中&#xff0c;當我們發現loss的值很小的時候&#xff0c;這時我們可能以為gradident已經到了local min0&#xff08;低谷&#xff09;,但是很多時候&#xff0c;loss很小并不是因…

pytorch:tensorboard和transforms學習

tensorboard:可視化數據 在anaconda安裝&#xff1a; pip install tensorboard2.12.0最好使用這個版本 不然后面調用會報錯 因為版本過高的原因 然后還碰到了安裝的時候 安裝到C盤去了 但是我用的虛擬環境是在E盤&#xff1a;此時去C盤把那些新安裝的復制過來就好了 附錄我C盤的…

常用的100個opencv函數

以下是OpenCV中最常用的100個函數及其作用與注意事項的全面整理&#xff0c;按功能模塊分類&#xff0c;結合官方文檔與工業實踐優化排序。各函數均標注Python&#xff08;cv2&#xff09;和C&#xff08;cv::&#xff09;命名&#xff0c;重點參數以加粗突出&#xff1a; &…

【C++】紅黑樹,詳解其規則與插入操作

各位大佬好&#xff0c;我是落羽&#xff01;一個堅持不斷學習進步的大學生。 如果您覺得我的文章有所幫助&#xff0c;歡迎多多互三分享交流&#xff0c;一起學習進步&#xff01; 也歡迎關注我的blog主頁: 落羽的落羽 一、紅黑樹的概念與規則 紅黑樹是一種更加特殊的平衡二…

Camera相機人臉識別系列專題分析之十七:人臉特征檢測FFD算法之libhci_face_camera_api.so 296點位人臉識別檢測流程詳解

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: Camera相機人臉識別系列專題分析之十七:人臉特征檢測FFD算法之libhci_face_camera_api.so 296點位人臉識別檢測流程詳解 目錄 一、背景 二、:FFD算法libhci_face_camera_api.s…

PostgreSQL 16 Administration Cookbook 讀書筆記:第7章 Database Administration

編寫一個要么完全成功要么完全失敗的腳本 事務&#xff08;transaction&#xff09;可以實現all or nothing。不過這里指的是psql的-和--single-transaction選項。可以實現transaction wrapper&#xff1a; 此選項只能與一個或多個 -c 和/或 -f 選項組合使用。它會導致 psql 在…

DeepSeekMath:突破開源語言模型在數學推理中的極限

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" DeepSeekMath&#xff1a;突破開源語言模型在數學推理中的極限 摘要 數學推理由于其復雜且結構化的特性&#xff0c;對語言模型構成了重大挑戰。本文介紹了 DeepSeekMath 7B&#xff0c;該模型在 DeepSeek-Code…

實體類序列化報錯:Caused by: java.lang.NoSuchMethodException: com.xx.PoJo$Item.<init>()

原實體類代碼EqualsAndHashCode(callSuper true) Data public class Pojo extends BaseBean {private static final long serialVersionUID -4291335073882689552L;ApiModelProperty("")private Integer id;......private List<Item> list;AllArgsConstructo…

基于單片機病床呼叫系統/床位呼叫系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 該系統是以單片機STM32F103為核心的基于無線網絡的醫院病房呼叫系統&#xff0c;分為從機和主機兩…

[黑馬頭條]-登錄實現思路

需求分析在黑馬頭條項目中&#xff0c;登錄有兩種方式&#xff1a;一種是用戶輸入賬號密碼后登錄&#xff0c;這種方式登陸后的權限很大&#xff0c;可以查看&#xff0c;也可以進行其他操作&#xff1b;另一種方式就是用戶點擊不登錄&#xff0c;以游客的身份進入系統&#xf…

了解.NET Core狀態管理:優化技巧與常見問題解決方案

前言 歡迎關注dotnet研習社&#xff0c;今天我們聊聊“ .NET Core 中的狀態管理”。 在Web應用程序中&#xff0c;管理和維持狀態是一個非常重要的主題&#xff0c;尤其是在無狀態的環境中&#xff0c;如 HTTP 協議和 RESTful API。對于基于 .NET Core 構建的應用程序&#xff…