发布于2026-07-31 阅读(0)
扫一扫,手机访问
聊到C++的错误处理,其实并不是什么新鲜话题,但很多新手写代码时,往往栽在这上面。如果你在Linux上写C++程序,错误处理的方式其实就那么几种,每种都有它的适用场景和脾性。今天就来掰扯掰扯这些常见套路。

先说第一种,也是最原始的方式——返回错误码。函数通过返回值来告诉调用方:成功了返回0,出错了就返回一个非零值。简单粗暴,但足够用。举个最典型的例子,main函数里调用某个函数,然后检查返回值,如果非零,就打印错误信息并返回。这种方式在C语言时代就根深蒂固了,很多底层库仍然沿用。
int main() {
int result = some_function();
if (result != 0) {
std::cerr << "Error occurred in some_function()" << std::endl;
return result;
}
return 0;
}
第二种,就是C++的标志性特性——异常处理。用try、catch、throw三个关键字,把错误处理和控制流分离开。当函数内部遇到无法处理的错误时,直接抛出一个异常对象,调用方在try-catch块里接住并处理。这种方式的好处是,错误处理代码不会和正常逻辑混在一起,读起来清爽很多。比如下面这个例子,some_function发现错误条件时,抛出一个std::runtime_error,main函数里用try包住调用,catch块捕获异常并打印错误信息。
#include
int some_function() {
if (/* error condition */) {
throw std::runtime_error("An error occurred in some_function()");
}
return 0;
}
int main() {
try {
int result = some_function();
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
第三种,是针对系统级错误的——使用errno和strerror()。这是Unix/Linux环境下的传统做法,也是C标准库的一部分。比如打开一个不存在的文件,fopen返回nullptr,此时全局变量errno会被设置成对应的错误码,然后调用strerror(errno)就能拿到可读的错误信息。这种方式在操作文件、网络、进程等底层接口时非常常见。
#include
#include
#include
int main() {
FILE* file = fopen("nonexistent_file.txt", "r");
if (file == nullptr) {
std::cerr << "Error: " << std::strerror(errno) << std::endl;
return 1;
}
fclose(file);
return 0;
}
第四种,就是使用第三方库。比如Boost库中的boost::system和boost::asio模块,它们提供了一套更高级、更统一的错误处理机制,本质还是错误码和错误信息,但封装得更干净,也更容易和现代C++代码集成。当然,如果你不想引入Boost,C++17标准库里的std::error_code和std::system_error其实也能干类似的事。
总结一下,实际编程中怎么选?简单的小程序,返回错误码就够了,轻量、无额外开销。复杂一点的项目,尤其是涉及多层调用、资源管理的时候,异常处理是更好的选择,能让错误传播和处理更优雅。而系统级接口,老老实实用errno或者std::error_code。没有银弹,关键是理解每种方式的优劣,然后根据场景做出取舍。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8