📅  最后修改于: 2023-12-03 14:39:38.407000             🧑  作者: Mango
在 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
关键字重新抛出已经捕获的异常,让上层代码再次处理该异常,也可以抛出新的异常。需要注意的是,在重新抛出异常时,异常类型必须保持一致,否则可能会导致错误的行为。在抛出新的异常时,需要选择合适的异常类型,以便上层代码可以正确处理异常。