📜  C ++ |异常处理问题8(1)

📅  最后修改于: 2023-12-03 14:39:38.407000             🧑  作者: Mango

C++ 异常处理问题8

在 C++ 异常处理中,有时候我们需要在捕获异常后重新抛出该异常或者抛出新的异常。本篇文章将介绍如何在 C++ 中重新抛出异常以及如何抛出新的异常。

重新抛出异常

在 C++ 中,我们可以使用 throw 关键字重新抛出一个已经捕获的异常,让上层代码再次处理该异常。下面是一个示例代码:

#include <iostream>

void func2()
{
    try
    {
        // 抛出异常
        throw std::runtime_error("error occurred!");
    }
    catch(std::exception& e)
    {
        std::cout << "Exception caught in func2: " << e.what() << std::endl;
        
        // 重新抛出异常
        throw;
    }
}

void func1()
{
    try
    {
        func2();
    }
    catch(std::exception& e)
    {
        std::cout << "Exception caught in func1: " << e.what() << std::endl;
    }
}

int main()
{
    try
    {
        func1();
    }
    catch(std::exception& e)
    {
        std::cout << "Exception caught in main: " << e.what() << std::endl;
    }

    return 0;
}

输出结果为:

Exception caught in func2: error occurred!
Exception caught in func1: error occurred!
Exception caught in main: error occurred!

func2() 中抛出异常后被 catch 语句捕获,然后使用 throw 关键字重新抛出该异常,上层代码 func1() 再次捕获该异常。

抛出新的异常

在 C++ 中,我们也可以使用 throw 关键字抛出新的异常。下面是一个示例代码:

#include <iostream>

void func2()
{
    try
    {
        // 抛出异常
        throw std::runtime_error("error occurred!");
    }
    catch(std::exception& e)
    {
        std::cout << "Exception caught in func2: " << e.what() << std::endl;
        
        // 抛出新的异常
        throw std::logic_error("logic error occurred!");
    }
}

void func1()
{
    try
    {
        func2();
    }
    catch(std::exception& e)
    {
        std::cout << "Exception caught in func1: " << e.what() << std::endl;
    }
}

int main()
{
    try
    {
        func1();
    }
    catch(std::exception& e)
    {
        std::cout << "Exception caught in main: " << e.what() << std::endl;
    }

    return 0;
}

输出结果为:

Exception caught in func2: error occurred!
Exception caught in func1: logic error occurred!
Exception caught in main: logic error occurred!

func2() 中抛出异常后被 catch 语句捕获,然后使用 throw 关键字抛出新的异常。上层代码 func1() 捕获到的则是新的异常。

总结

在 C++ 异常处理中,我们可以使用 throw 关键字重新抛出已经捕获的异常,让上层代码再次处理该异常,也可以抛出新的异常。需要注意的是,在重新抛出异常时,异常类型必须保持一致,否则可能会导致错误的行为。在抛出新的异常时,需要选择合适的异常类型,以便上层代码可以正确处理异常。