标准库算法本身不抛异常,但用户自定义函数或内存分配失败可能引发异常,需用try-catch捕获;例如bad_compare抛出invalid_argument,应优先捕获具体异常类型以确保程序健壮性。

标准库算法通常不会主动抛出异常,但它们在执行过程中可能间接引发异常,比如用户自定义的比较函数、谓词或操作函数对象抛出异常,或者内存分配失败等。要捕获这些异常,需使用 C++ 的异常处理机制,即 try-catch 块。
理解标准库算法异常来源
大多数标准库算法(如 std::sort、std::find_if、std::transform)本身不抛出异常,但如果传入的函数对象或操作抛出异常,该异常会传播出来。例如:
- 自定义比较函数中抛出异常
- lambda 表达式内部发生错误
- 容器操作中内存不足(如涉及动态分配)
例如,以下代码中,比较函数故意抛出异常:
#include#include #include bool bad_compare(int a, int b) { if (a == 0 || b == 0) throw std::invalid_argument("Zero not allowed!"); return a < b; }
int main() { std::vector
vec = {3, 1, 0, 4}; try { std::sort(vec.begin(), vec.end(), bad_compare); } catch (const std::invalid_argument& e) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Caught exception: " zuojiankuohaophpcnzuojiankuohaophpcn e.what() zuojiankuohaophpcnzuojiankuohaophpcn '\n'; } return 0;}
立即学习“C++免费学习笔记(深入)”;
使用 try-catch 捕获异常
在调用可能间接引发异常的算法时,将其放入 try 块中,并用合适的 catch 块捕获异常类型:
- 捕获具体异常类型,如 std::invalid_argument
- 捕获基类异常 std::exception 以处理通用标准异常
- 必要时捕获 const std::exception& 获取错误信息
示例:
#include#include #include #include int main() { std::vector
data = {5, 2, 8, 1}; try { std::transform(data.begin(), data.end(), data.begin(), [](int n) { if (n == 2) throw std::runtime_error("Transform failed!"); return n * 2; }); } catch (const std::runtime_error& e) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Runtime error: " zuojiankuohaophpcnzuojiankuohaophpcn e.what() zuojiankuohaophpcnzuojiankuohaophpcn '\n'; } catch (const std::exception& e) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Standard exception: " zuojiankuohaophpcnzuojiankuohaophpcn e.what() zuojiankuohaophpcnzuojiankuohaophpcn '\n'; } catch (...) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Unknown exception caught\n"; } return 0;}
立即学习“C++免费学习笔记(深入)”;
最佳实践建议
为确保程序健壮性,注意以下几点:
- 了解传给算法的函数对象是否可能抛出异常
- 优先捕获具体异常类型,再考虑通用捕获
- 避免在算法的谓词或操作中抛出异常,除非是严重错误
- 在性能敏感场景,考虑异常安全保证(如基本异常安全)
基本上就这些。只要在调用标准库算法时,其回调逻辑可能抛异常,就用 try-catch 包裹调用即可。关键是明确异常来源并合理处理。










