一、 为什么要有异常?
-
传统错误处理的缺点
- 错误码(C风格):
- 需要手动检查返回值,代码冗余。
- 容易忽略错误(如忘记检查
errno)。
- 全局状态(如
errno):- 非线程安全,状态可能被覆盖。
- 错误码(C风格):
-
异常的优势
- 分离正常逻辑和错误处理:
try/catch结构清晰。 - 自动传播错误:异常可跨多层函数调用传递。
- 类型安全:异常是对象(如
std::runtime_error),可携带详细信息。
- 分离正常逻辑和错误处理:
-
适用场景
- 不可恢复的错误(如内存不足、文件不存在)。
- 构造函数失败(无法通过返回值报错)。
二、 异常的用法
-
抛出异常
-
使用
throw关键字抛出任意类型的对象(推荐继承std::exception):void loadFile(const std::string& path) { if (!fileExists(path)) { throw std::runtime_error("File not found: " + path); } }
-
-
捕获异常
-
try/catch块按顺序匹配异常类型:try { loadFile("data.txt"); } catch (const std::runtime_error& e) { std::cerr << "Error: " << e.what() << std::endl; } catch (...) { // 捕获所有异常(慎用) std::cerr << "Unknown error" << std::endl; }
-
-
标准异常类
异常类 用途 std::exception所有标准异常的基类 std::runtime_error运行时错误(如文件不存在) std::logic_error逻辑错误(如无效参数) std::bad_alloc内存分配失败
三、 谨慎使用异常
-
性能开销
- 异常处理会增加代码大小和运行时开销(尤其在未抛出异常时)。
-
设计原则</

最低0.47元/天 解锁文章
1014

被折叠的 条评论
为什么被折叠?



