C/C++中函數(shù)分裝時(shí)錯(cuò)誤處理的常見(jiàn)方法
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)單直接,性能高(無(wú)異常開(kāi)銷)。
- 適用于嵌入式或高性能計(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):
無(wú)法攜帶詳細(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):
- 異常處理有額外開(kāi)銷。
- 濫用異??赡軐?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ò)誤已打印,無(wú)需額外處理
}
優(yōu)點(diǎn):
簡(jiǎn)單直接,適合調(diào)試。
缺點(diǎn):
錯(cuò)誤處理不夠靈活(日志可能被忽略)。
最佳實(shí)踐建議
- 簡(jiǎn)單錯(cuò)誤 → 使用 std::optional 或錯(cuò)誤碼。
- 關(guān)鍵錯(cuò)誤 → 使用異常(如文件無(wú)法打開(kāi)、內(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ò)誤處理的常見(jiàn)方法的文章就介紹到這了,更多相關(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-11
C/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)教程詳解,本文通過(guò)代碼演示給大家介紹的非常詳細(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é)介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析二叉樹(shù)的操作
二叉樹(shù)可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹(shù)的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-04-04

