C++ 异常处理与调试面试题
1. C++的异常处理机制是什么?
答案:
- 基本语法
try {
// 可能抛出异常的代码
throw runtime_error("Error occurred");
} catch (const exception& e) {
// 处理异常
cout << e.what() << endl;
} catch (...) {
// 捕获所有异常
}
- 异常类层次exception(基类)logic_error:逻辑错误invalid_argumentout_of_rangelength_errorruntime_error:运行时错误overflow_errorunderflow_errorrange_errorbad_alloc:内存分配失败bad_cast:类型转换失败
- 异常传播沿调用栈向上传播直到被捕获或到达main未捕获异常调用terminate()
- 栈展开(Stack Unwinding)异常抛出后,自动调用局部对象的析构函数保证资源正确释放RAII的重要性
2. 什么时候应该使用异常?
答案:
- 适合使用异常错误无法在当前层级处理构造函数失败(无返回值)运算符重载失败深层调用栈的错误传播异常情况,非正常流程
- 不适合使用异常正常的控制流程性能关键代码可预期的错误(用返回值)析构函数中(可能导致程序终止)
- 异常 vs 返回值
// 返回值方式
int divide(int a, int b, int& result) {
if (b == 0) return -1; // 错误码
result = a / b;
return 0; // 成功
}
// 异常方式
int divide(int a, int b) {
if (b == 0) throw invalid_argument("Division by zero");
return a / b;
}
- 异常的优势错误处理与正常逻辑分离强制处理错误自动资源清理
- 异常的劣势性能开销代码流程不直观可能被忽略
3. noexcept的作用是什么?
答案:
- 定义声明函数不抛出异常C++11引入,替代throw()
- 语法
void func() noexcept; // 不抛异常
void func() noexcept(true); // 不抛异常
void func() noexcept(false); // 可能抛异常
// 条件noexcept
template<typename T>
void swap(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
T temp(std::move(a));
a = std::move(b);
b = std::move(temp);
}
- 作用编译器优化移动构造函数应该标记noexcept容器操作更高效(如vector扩容)
- 违反noexcept如果noexcept函数抛异常调用std::terminate()程序终止
- 使用建议移动构造和移动赋值标记noexcept析构函数默认noexceptswap函数标记noexcept确保不会抛异常再使用
4. 如何自定义异常类?
答案:
- 继承std::exception
class MyException : public std::exception {
string message;
public:
MyException(const string& msg) : message(msg) {}
const char* what() const noexcept override {
return message.c_str();
}
};
- 使用示例
void process(int value) {
if (value < 0) {
throw MyException("Value must be non-negative");
}
}
try {
process(-1);
} catch (const MyException& e) {
cout << "Error: " << e.what() << endl;
}
- 最佳实践继承标准异常类重写what()方法what()标记为noexcept提供有意义的错误信息
5. 异常安全性的三个级别是什么?
答案:
- 基本保证(Basic Guarantee)异常发生后,对象仍处于有效状态不泄漏资源可能改变对象状态
- 强保证(Strong Guarantee)操作成功或完全回滚
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.
查看17道真题和解析