C++程序 处理检查异常
异常是程序在执行期间发生的运行时错误,会破坏程序正常指令流的情况。例如,内存不足、磁盘空间不足、除以零等等。
异常类型
有两种类型的异常,内置异常和用户定义异常。内置异常可以分为两大类:
- 检查异常: 这些是编译时异常,因为编译器在编译时检查这些异常。编译器确保程序员处理异常或不处理异常。
- 未检查异常: 编译器不会在编译时检查未检查异常。它会在用户使用程序进行交互时输入错误的输入时发生。
什么是检查异常?
编译器检查异常以保证程序在运行时平稳执行。
- 检查异常通常发生异常。因此,编译器对这些异常非常关注。
- 可能会声明一个方法可以抛出异常,但实际上它确实没有。尽管如此,调用者仍然必须处理它。
- 检查异常声明具有多米诺骨牌效应。使用前一个方法的任何方法也必须处理检查异常。
Exception类是异常继承的基类。例如,InvalidCastException类层次结构如下:Object。Exception。SystemException。
为什么C++编译器不检查异常?
C++提供了检查异常的语法。
例子:
void G() throw(Exception);
void f() throw();
C++编译器不检查异常的原因有3个:
1. C++异常规范抑制优化: 除了throw()可能外,编译器插入额外的代码来检查当您抛出异常时,它是否与堆栈解退期间函数的异常规范匹配。这是使您的程序变慢的方法。
2. C++异常规范不受编译器强制执行: 就您的编译器而言,以下是语法上正确的:
void AStupidFunction() throw()
{
throw 42;
}
如果违反了异常规范,则程序将终止执行。
3. C++异常规范是函数签名的一部分: 如果您有一个具有虚拟函数的基类,并试图覆盖它,则异常规范必须完全匹配。因此,您最好提前计划,这仍然很繁琐。
struct A
{
virtual int value() const throw()
{
return 10;
}
}
struct B : public A
{
// ERROR!
virtual int value() const
{
return functionThatCanThrow();
}
}
异常规范会给您带来这些问题,使用它们的收益很小。相比之下,如果您完全避免异常规范,编码更容易,而且可以避免这些麻烦。
异常处理
异常处理是处理运行时错误的过程。我们执行异常处理,以便在发生运行时错误后仍然可以维护程序的正常流程。它旨在仅处理程序中的同步异常。C++异常处理建立在三个关键字上:try、catch和throw。
1. try块: 一个包含其他可能抛出异常的代码块。
语法:
try{
语句1;
语句2;
}
2.捕获: 这将使用某种解决方案处理异常。
语法:
try{
语句1;
语句2;
}
catch(参数)
{
//操作
语句3;
}
3.抛出: 可以在某些异常条件之后添加此语句。
throw(excep);
throw excep;
throw; // 重新抛出
你如何处理异常?
异常处理是处理运行时错误的过程。我们执行异常处理。因此,即使在运行时发生错误后,程序的正常流程也可以继续。它旨在仅处理程序中的同步异常。
尝试捕捉是处理异常的最简单方法。将您要运行的代码放在尝试块中,任何代码引发的Java异常都会被一个或多个catch块捕获。此方法会捕获引发的任何类型的Java异常。这是处理异常的最简单机制
以下是处理已检查异常的C ++程序:
// C++ program to handle
// exceptions
#include <iostream>
using namespace std;
int division(int a, int b)
{
// Checking if the denominator
// is 0 or not.
if (b == 0)
{
// If the denominator is 0, then
// we must throw an exception
throw "Division by zero!";
}
// If there is no exception, then
// we are returning the answer.
return int(a / b);
}
// Driver code
int main()
{
int x = 50;
int y = 0;
int answer = 0;
/*
Using a try catch block because in division,
the denominator can be 0.
So, we must handle the 0 division inside try block.
*/
try
{
answer = division(x, y);
cout << " Output: " << answer << endl;
}
// Printing the thrown exception from
// the function
catch (const char *errorMessage)
{
cout << errorMessage << endl;
}
return 0;
}
输出
Division by zero!