C/C++中函數(shù)分裝時(shí)錯(cuò)誤處理的常見方法
1. 使用返回值(錯(cuò)誤碼)
適用于簡(jiǎn)單函數(shù),尤其是性能敏感的場(chǎng)景。
// 返回 0 表示成功,非 0 表示錯(cuò)誤碼 int ComputeSomething(int input, double& output) { if (input < 0) { return 1; // 錯(cuò)誤碼 1:非法輸入 } output = sqrt(input); return 0; // 成功 } // 調(diào)用示例: double result; int err = ComputeSomething(-1, result); if (err != 0) { std::cerr << "Error: " << err << std::endl; // 處理錯(cuò)誤... }
優(yōu)點(diǎn):
- 簡(jiǎn)單直接,性能高(無異常開銷)。
- 適用于嵌入式或高性能計(jì)算。
缺點(diǎn):
- 調(diào)用者必須檢查返回值,容易遺漏。
- 錯(cuò)誤信息不夠豐富(只能返回?cái)?shù)字代碼)。
2. 使用 std::optional 或 std::expected(C++23)
適用于可能失敗但不需要詳細(xì)錯(cuò)誤信息的函數(shù)。
#include <optional> #include <cmath> std::optional<double> SafeSqrt(double x) { if (x < 0) { return std::nullopt; // 表示失敗 } return sqrt(x); } // 調(diào)用示例: auto result = SafeSqrt(-1); if (!result) { std::cerr << "Error: Invalid input" << std::endl; // 處理錯(cuò)誤... }
優(yōu)點(diǎn):
- 比錯(cuò)誤碼更清晰,避免魔數(shù)(magic numbers)。
- 適用于可能失敗但不需要詳細(xì)錯(cuò)誤信息的場(chǎng)景。
缺點(diǎn):
無法攜帶詳細(xì)的錯(cuò)誤信息(只能表示成功/失敗)。
3. 拋出異常(throw)
適用于嚴(yán)重錯(cuò)誤或不可恢復(fù)的錯(cuò)誤。
#include <stdexcept> double ComputeSomething(int input) { if (input < 0) { throw std::invalid_argument("Input must be non-negative"); } return sqrt(input); } // 調(diào)用示例: try { double result = ComputeSomething(-1); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; // 處理錯(cuò)誤... }
優(yōu)點(diǎn):
- 錯(cuò)誤信息豐富(可以攜帶字符串描述)。
- 適用于嚴(yán)重錯(cuò)誤,避免錯(cuò)誤傳播。
缺點(diǎn):
- 異常處理有額外開銷。
- 濫用異??赡軐?dǎo)致代碼難以維護(hù)。
4. 使用自定義錯(cuò)誤結(jié)構(gòu)(結(jié)構(gòu)化錯(cuò)誤)
適用于需要返回復(fù)雜錯(cuò)誤信息的場(chǎng)景。
#include <string> #include <variant> // 定義可能的錯(cuò)誤類型 struct Error { int code; std::string message; }; // 使用 std::variant 表示可能成功或失敗 template <typename T> using Result = std::variant<T, Error>; Result<double> SafeDivide(double a, double b) { if (b == 0) { return Error{1, "Division by zero"}; } return a / b; } // 調(diào)用示例: auto result = SafeDivide(1, 0); if (std::holds_alternative<Error>(result)) { auto err = std::get<Error>(result); std::cerr << "Error " << err.code << ": " << err.message << std::endl; // 處理錯(cuò)誤... }
優(yōu)點(diǎn):
- 錯(cuò)誤信息結(jié)構(gòu)化(錯(cuò)誤碼 + 描述)。
- 適用于需要詳細(xì)錯(cuò)誤信息的 API。
缺點(diǎn):
- 需要 C++17(std::variant)。
- 比錯(cuò)誤碼稍復(fù)雜。
5. 使用日志記錄(Logging)
適用于調(diào)試或非關(guān)鍵錯(cuò)誤。
#include <iostream> bool ComputeSomething(int input, double& output) { if (input < 0) { std::cerr << "[ERROR] Input must be non-negative" << std::endl; return false; } output = sqrt(input); return true; } // 調(diào)用示例: double result; if (!ComputeSomething(-1, result)) { // 錯(cuò)誤已打印,無需額外處理 }
優(yōu)點(diǎn):
簡(jiǎn)單直接,適合調(diào)試。
缺點(diǎn):
錯(cuò)誤處理不夠靈活(日志可能被忽略)。
最佳實(shí)踐建議
- 簡(jiǎn)單錯(cuò)誤 → 使用 std::optional 或錯(cuò)誤碼。
- 關(guān)鍵錯(cuò)誤 → 使用異常(如文件無法打開、內(nèi)存不足)。
- 復(fù)雜錯(cuò)誤 → 使用 std::expected(C++23)或自定義 Result 類型。
- 調(diào)試/日志 → 結(jié)合日志記錄(如 spdlog 或 std::cerr)。
你的選擇應(yīng)該基于:
- 性能需求(異常 vs 錯(cuò)誤碼)。
- 錯(cuò)誤嚴(yán)重程度(可恢復(fù) vs 不可恢復(fù))。
- 代碼可讀性(結(jié)構(gòu)化錯(cuò)誤 vs 簡(jiǎn)單錯(cuò)誤碼)。
到此這篇關(guān)于C/C++中函數(shù)分裝時(shí)錯(cuò)誤處理的常見方法的文章就介紹到這了,更多相關(guān)C/C++錯(cuò)誤處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手教你實(shí)現(xiàn)一個(gè)C++單鏈表
鏈表是一種數(shù)據(jù)結(jié)構(gòu),用于數(shù)據(jù)的存儲(chǔ)。這篇文章主要為大家介紹了如何實(shí)現(xiàn)一個(gè)C++單鏈表,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-11-11C/C++ Crypto密碼庫(kù)調(diào)用的實(shí)現(xiàn)方法
Crypto 庫(kù)是C/C++的加密算法庫(kù),這個(gè)加密庫(kù)很流行,基本上涵蓋了市面上的各類加密解密算法,感興趣的可以參考一下2021-06-06史上最強(qiáng)C語(yǔ)言分支和循環(huán)教程詳解
這篇文章主要介紹了史上最強(qiáng)C語(yǔ)言分支和循環(huán)教程詳解,本文通過代碼演示給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11深入學(xué)習(xí)C語(yǔ)言中的函數(shù)指針和左右法則
這篇文章主要介紹了深入學(xué)習(xí)C語(yǔ)言中的函數(shù)指針和左右法則,左右法則是一種常用的C指針聲明,需要的朋友可以參考下2015-08-08關(guān)于C++中的友元函數(shù)的一些總結(jié)
以下是對(duì)C++中的友元函數(shù)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下2013-09-09C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析二叉樹的操作
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-04-04