MST

星途 面试题库

面试题:C++异常处理机制中异常的抛出与捕获原理

请详细阐述在C++中异常是如何抛出以及被捕获的?在函数调用链中异常传递的规则是什么?请举例说明。
19.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 异常的抛出

    • 在C++中,使用throw关键字来抛出异常。throw可以抛出任何类型的值,包括内置类型(如intdouble等)、自定义类型(类)等。例如:
    void divide(int a, int b) {
        if (b == 0) {
            throw "Division by zero";
        }
        std::cout << "Result: " << a / b << std::endl;
    }
    
    • 这里当b为0时,抛出一个const char*类型的异常,表示“Division by zero”。
  2. 异常的捕获

    • 异常通过try - catch块来捕获。try块包含可能抛出异常的代码。catch块用于捕获并处理特定类型的异常。例如:
    int main() {
        try {
            divide(10, 0);
        } catch (const char* msg) {
            std::cerr << "Caught exception: " << msg << std::endl;
        }
        return 0;
    }
    
    • 在上述代码中,try块调用divide函数,该函数可能抛出异常。catch块捕获const char*类型的异常,并输出错误信息。
  3. 函数调用链中异常传递的规则

    • 当一个函数抛出异常时,如果该函数内部没有捕获异常,异常会沿着函数调用链向上传递,直到被某个catch块捕获。
    • 例如:
    void functionC() {
        throw 42;
    }
    void functionB() {
        functionC();
    }
    void functionA() {
        try {
            functionB();
        } catch (int e) {
            std::cerr << "Caught in functionA: " << e << std::endl;
        }
    }
    int main() {
        functionA();
        return 0;
    }
    
    • 在这个例子中,functionC抛出一个int类型的异常,functionB没有捕获这个异常,异常继续向上传递到functionAfunctionA通过catch (int e)捕获到该异常并处理。如果functionA也没有捕获异常,异常会继续向上传递到main函数,若main函数也不捕获,程序将调用std::terminate终止运行。