C++程序 处理异常方法
异常处理是处理运行时错误的一种方式,我们进行异常处理,以便即使在运行时出现错误,程序的正常流程也能被维护。异常是程序在执行中遇到的运行时异常或异常条件。
异常处理机制提供了一种从程序的一个部分传输控制到另一个部分的方法,这使得将错误处理代码与用于解决程序实际功能的代码分离变得容易。
C++为异常处理提供了以下专用关键字:
- try: 通常将可能引发异常的代码块放置在try块中,然后跟随一个或多个catch块。如果发生异常,则它会从try块中抛出。
- catch: 此块捕捉从try块中抛出的异常,在此catch块中编写处理异常的代码。
- throw: throw关键字用于抛出异常。也用于列出函数抛出但不自己处理的异常。
语法:
try
{
//尝试的代码块
//当问题出现时抛出异常
throw exception;
}
catch()
{
//处理错误的代码块
}
以下是用于演示如何在C++中处理异常的C++程序:
示例1: 以下是用于演示当除以零时会发生什么以及未处理异常的C++程序。
//C++程序演示除以零时发生的情况
//并且未处理异常
#include
using namespace std;
//驱动程序
int main()
{
int numerator = 5;
int denominator = 0;
int ans = numerator/denominator;
//结果将不会显示
cout << ans << endl;
return 0;
}
输出:
浮点异常(SIGFPE)
上述程序将显示异常行为,并且不会显示任何输出。代码中抛出异常,但未被捕获,因此可能显示浮点异常或不显示任何输出。
以下是用于处理除以零异常的C++程序:
//C++程序处理
//除以零异常
#include
using namespace std;
//驱动程序
int main()
{
int numerator = 5;
int denominator = 0;
int result;
try
{
if(denominator == 0)
{
throw denominator;
}
result = numerator / denominator;
}
catch(int ex)
{
cout << "Exception: Divide by zero not allowed :" <<
ex << endl;
}
cout << "Division Result is: " << result;
return 0;
}
输出
例外:不允许除以零:0
Division Result is: 4197440
示例2: 以下是用于输入年龄整数的C++程序,如果年龄小于18则返回NO,但如果年龄大于等于18则返回Yes:
// C++ program to define a new exception
#include <iostream>
#include <exception>
using namespace std;
// Custom exception
class MyException: public exception
{
public:
virtual const char* what() const throw()
{
return "My Custom Exception";
}
};
// Driver code
int main()
{
try
{
throw MyException();
}
catch(MyException &e;)
{
cout << e.what() << endl;
}
return 0;
}
Output
My Custom Exception
C++ Standard Exceptions
C++定义了一组在<exception>
中定义的标准异常,可以在程序中使用这些异常。 这些异常按照父-子类层次结构排列。下表列出了具有描述的标准异常:
S.No. | Exception | Description |
---|---|---|
1. | std::exception | 所有标准C++异常的异常和父类。 |
2. | std::bad_alloc | new可以抛出此异常。 |
3. | std::bad_cast | dynamic_cast可以抛出此异常。 |
4. | std::bad_exception | 此异常是C++程序中处理意外异常的有用工具。 |
5. | std::bad_typeid | type id可以抛出此异常。 |
6. | std::logic_error | 可以通过读取代码检测到的异常。 |
7. | std::domain_error | 当使用数学上无效的域时抛出此异常。 |
8. | std::invalid_argument | 由于无效参数而抛出此异常。 |
9. | std::length_error | 创建了过大的std :: string时抛出此异常。 |
10. | std::out_of_range | 此异常可以由’at’方法抛出,例如std :: vector和std :: bitset<> :: operator []()。 |
11. | std::runtime_error | 理论上无法通过阅读代码检测到的异常 |
12. | std::overflow_error | 如果发生数学上溢出,则会引发此异常。 |
13. | std::range_error | 当您尝试存储超出范围的值时发生。 |
14. | std::underflow_error | 如果发生数学下溢,则会引发此异常。 |
C++中的新异常
可以通过继承和覆盖异常类功能来定义自定义异常。
语法:
using std :: exception
以下是定义新异常的C++程序:
// C++程序定义一个新的异常
#include <iostream>
#include <exception>
using namespace std;
struct Exceptions : public exception
{
const char* Except() const throw ()
{
return "GeeksforGeeks";
}
};
// 驱动程序
int main()
{
try
{
throw Exceptions();
}
catch(Exceptions& it)
{
cout << "Customised Exception caught" <<
endl;
cout << it.Except() <<endl;
}
catch(std::exception& it)
{}
}
输出结果:
Customised Exception caught
GeeksforGeeks