C++程序 处理检查异常

C++程序 处理检查异常

异常是程序在执行期间发生的运行时错误,会破坏程序正常指令流的情况。例如,内存不足、磁盘空间不足、除以零等等。

异常类型

有两种类型的异常,内置异常和用户定义异常。内置异常可以分为两大类:

  1. 检查异常: 这些是编译时异常,因为编译器在编译时检查这些异常。编译器确保程序员处理异常或不处理异常。
  2. 未检查异常: 编译器不会在编译时检查未检查异常。它会在用户使用程序进行交互时输入错误的输入时发生。

什么是检查异常?

编译器检查异常以保证程序在运行时平稳执行。

  • 检查异常通常发生异常。因此,编译器对这些异常非常关注。
  • 可能会声明一个方法可以抛出异常,但实际上它确实没有。尽管如此,调用者仍然必须处理它。
  • 检查异常声明具有多米诺骨牌效应。使用前一个方法的任何方法也必须处理检查异常。

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!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例