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++工程能力.

全部评论
问下进度
点赞 回复 分享
发布于 02-26 21:29 北京

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务