C++ 错误处理:try/catch 与高级技术

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ 高级错误处理:从 try/catch 到工业实践



错误处理是工业编程的基石之一。在 C++ 中,开发者不仅可以使用经典的 try/catch 机制,还可以运用一整套高级技术:从 RAII 到异常安全保证。本文将讲解如何编写可靠的 C++ 代码,使其能够正确处理故障、不泄漏资源并保持可读性。



1. try/catch 的基础与常见陷阱



基本语法大家都熟悉:



#include <iostream>#include <stdexcept>

void dangerousFunction(int value) { if (value < 0) { throw std::invalid_argument("Value must be non-negative"); } // ... 使用 value 进行操作}

int main() { try { dangerousFunction(-5); } catch (const std::invalid_argument& e) { std::cerr << "Error: " << e.what() << std::endl; } catch (const std::exception& e) { std::cerr << "Generic error: " << e.what() << std::endl; } catch (...) { std::cerr << "Unknown exception caught" << std::endl; } return 0;}


重要事项:

  • 按引用捕获 — catch (const std::exception& e) 避免对象切片。
  • catch 块的顺序很重要: 先捕获更具体的异常,再捕获通用异常。
  • 不要滥用 catch (...) — 它会隐藏所有错误,包括关键性错误(例如 std::bad_alloc)。
  • 绝不要在析构函数中抛出异常 — 这会导致未定义行为(通常导致程序崩溃终止)。


2. RAII 作为 try/catch 的资源管理替代方案



RAII (Resource Acquisition Is Initialization) 是 C++ 的关键模式,它使异常变得安全。其思想是:资源在构造函数中获取,在析构函数中释放。如果发生异常,所有已创建对象的析构函数会自动调用(栈展开)。



#include <fstream>#include <vector>#include <stdexcept>

void processFile(const std::string& filename) { std::ifstream file(filename); // RAII:文件在构造函数中打开 if (!file.is_open()) { throw std::runtime_error("Cannot open file: " + filename); }

std::vector<int> data; int value; while (file >> value) { data.push_back(value); } // file 的析构函数会自动关闭文件, // 即使发生异常(例如 push_back 时的 bad_alloc)也会执行}


RAII 相对于手动 try/catch 的优势:

  • 无需编写 finally 块 — 析构函数保证资源清理。
  • 代码更加线性且可读性更强。
  • 异常不会导致内存、文件描述符等资源的泄漏。


3. 异常安全保证



在 C++ 中,通常将函数的安全保证分为三个级别:



  • No-throw guarantee — 函数从不抛出异常。使用 noexcept 标记。
  • Strong guarantee — 如果发生异常,程序状态保持不变(原子操作)。
  • Basic guarantee — 发生异常时不会泄漏资源,对象保持一致状态,但其值可能发生变化。


Strong guarantee 示例(copy-and-swap 惯用法):



#include <algorithm>  // 用于 std::swap#include <vector>#include <stdexcept>

class SafeVector { std::vector<int> data_;public: void push_back(int value) { // 1. 创建

博客

书籍推荐