C++异常处理
1.C++中异常处理的简介。
异常是程序执行过程中出现的一些非预期的情况,列入除零错误、空指针等。C++异常处理是通过try、catch、throw关键字提供了有一中结构化的、可维护的错误处理机制。
例如:
#include <iostream>
using namespace std;
int main()
{
try
{
// 可能会抛出异常
int nRtn = 10 / 0; // 除零错误
}
catch (const std::exception& e)
{
std::cerr << "Catch Excepyion" << e.what() << endl;
}
std::cout << "Hello World!\n";
}
上面代码运行时出现:error C2124: 被零除或对零求模。
2.C++中异常的层次结构。
在C++中异常是通过类表示的,我们也可以定义自己的异常类,建立更有异常层次的异常处理机制。
例如:
class CMyException :public exception
{
public:
const char* what() const noexcept override
{
return "MyException Occurred";
}
};
int main()
{
try
{
可能会抛出异常
//int nRtn = 10 / 0; // 除零错误
throw CMyException();
}
catch (const std::exception& e)
{
std::cerr << "Catch Excepyion" << e.what() << endl;
}
std::cout << "Hello World!\n";
}
通过自定义异常类,你可以根据程序的需求建立更为灵活的异常处理结构。在捕获异常时,按照异常类的层次结构进行捕获,从而实现更精细的异常处理。
3.C++异常的抛出。
使用throw可以再程序的任何位置抛出异常,将控制流传递给最近的catch块。
例如:
void SomeFunction()
{
//......
if (errorCondition)
throw std::runtime_error("Someting Rong");
//......
}
int main()
{
try
{
可能会抛出异常
//int nRtn = 10 / 0; // 除零错误
// throw CMyException();
SomeFunction();
}
catch (const std::exception& e)
{
std::cerr << "Catch Excepyion" << e.what() << endl;
}
std::cout << "Hello World!\n";
}
通过在 someFunction 中抛出异常,我们可以在适当的时候中断程序的正常执行流程,转而执行异常处理代码。
4.RAII(资源获取即初始化)
RAII(Resource Acquisition Is Initialization) 是C++中一中广泛使用的编程范式,通过对象的生命周期来管理资源。在异常处理中,
RAII能够确保在异常发生时资源被正确的释放,避免内存泄漏和资源泄露。
例如:
class CFileHandler
{
public:
CFileHandler(const char* pFileName)
{
m_pFile = fopen(pFileName,"r");
if (!m_pFile)
throw std::runtime_error("Open File Failed");
}
~CFileHandler()
{
if (m_pFile)
fclose(m_pFile);
}
private:
FILE* m_pFile;
};
int main()
{
try
{
可能会抛出异常
//int nRtn = 10 / 0; // 除零错误
// throw CMyException();
// SomeFunction();
CFileHandler file("example.txt");
}
catch (const std::exception& e)
{
std::cerr << "Catch Excepyion" << e.what() << endl;
}
std::cout << "Hello World!\n";
}
该程序输出:
5.标准异常类
C++标准库提供了一组标准异常类,它们派生自 std::exception。这些异常类包括 std::runtime_error、std::logic_error等,提供了一些常用的异常类型,以便程序员更容易地理解和处理异常。
正如前面程序中的runtime_errore类的用法。
最后:异常处理是C++编程中的一项重要技能,合理而灵活地使用异常处理,将为你的程序增添一份强大的防护盾,确保其在各种情况下都能稳健运行。让你的C++代码更加健壮、可维护。