发布于:2021-01-28 11:37:51
0
262
0
什么是C ++中的异常处理?
C ++中的异常处理为您提供了一种处理意外情况(如运行时错误)的方法。因此,每当发生意外情况时,程序控制就会转移到称为处理程序的特殊功能。
要捕获异常,请将代码的某些部分置于异常检查之下。代码段位于try-catch块中。
如果在该代码段中发生异常情况,将引发异常。接下来,异常处理程序将接管程序的控制。
如果没有异常情况,代码将正常执行。处理程序将被忽略。
为什么要进行异常处理?
这是在C ++中使用异常处理的原因:
您将把错误处理代码与常规代码分开。该代码将更具可读性,并且易于维护。
函数可以处理他们选择的异常。即使一个函数抛出许多异常,它也只会处理一些异常。调用方将处理未捕获的异常。
异常处理关键字
C ++中的异常处理涉及以下三个关键字:
throw-当程序遇到问题时,它将引发异常。throw关键字可帮助程序执行throw。
catch-程序使用异常处理程序来捕获异常。它被添加到需要处理该问题的程序部分。使用catch关键字即可完成。
try -try块标识将为其激活某些异常的代码块。它后面应该是一个/多个捕获块。
假设代码块将引发异常。异常将被使用try和catch关键字的方法捕获。try / catch块应包含可能引发异常的代码。此类代码称为受保护代码。
句法:
try / catch采用以下语法:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
尽管我们有一个try语句,但是我们可以有很多catch语句。
ExceptionName是要捕获的异常的名称。
exception1,exception2和exceptionN是您定义的用于引用异常的名称。
范例1:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); // access the third element, which doesn't exist try { vec.at(2); } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
输出:
这是代码的屏幕截图:
代码说明:
在程序中包含iostream头文件以使用其功能。
将矢量头文件包含在程序中以使用其功能。
在程序中将std名称空间包括在其类中,而不调用它。
调用main()函数。程序逻辑应添加在其主体内。
创建一个名为vec的向量来存储整数数据。
将元素0添加到名为vec的向量中。
将元素1添加到名为vec的向量中。
一条评论。C ++编译器将跳过它。
使用try语句捕获异常。{标记为try / catch块主体的开始。正文中添加的代码将成为受保护的代码。
尝试访问存储在名为vec的向量的索引2(第三个元素)处的元素。该元素不存在。
try / catch块的主体末端。
捕获异常。返回的错误消息将存储在变量ex中。
如果捕获到异常,请在控制台上打印一些消息。
捕获块的主体末端。
程序应在成功执行后返回一个值。
main()函数主体的结尾。
范例2:
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return (x / y); } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
输出:
这是代码的屏幕截图:
代码说明:
在程序中包含iostream头文件以使用其功能。
在程序中将std名称空间包括在其类中,而不调用它。
创建一个名为zeroDivision的函数,该函数接受两个整数参数x和y。该函数应返回一个双精度结果。
使用if语句检查变量参数y的值是否为0。{标记if正文的开头。
如果y为0,则返回/抛出该消息。
if语句的主体结尾。
zeroDivision函数应返回x / y的值。
zeroDivision函数的主体结尾。
调用main()方法。{表示此方法的开始。
声明一个整数变量并将其赋值为11。
声明一个整数变量b并将其赋值为0。
声明一个双精度变量c并将其赋值为0。
使用try语句捕获异常。{标记为try / catch块主体的开始。正文中添加的代码将成为受保护的代码。
调用zeroDivision函数并传递给参数a和b,即11和0。此操作的结果将存储在变量c中。
在控制台上打印出变量c的值。
try / catch块的主体末端。
捕获异常。返回的错误消息将存储在变量消息中。
在控制台上打印出返回的错误消息。
捕获块的主体末端。
程序应在成功执行后返回一个值。
main()函数主体的结尾。
C ++标准异常
C ++带有在<exception>类中定义的标准异常列表。如下所述:
用户定义的异常
C ++ std :: exception类允许我们定义可以作为异常抛出的对象。此类已在<exception>标头中定义。该类为我们提供了一个名为what的虚拟成员函数。
该函数返回char *类型的以空字符结尾的字符序列。我们可以在派生类中覆盖它以获取异常描述。
例:
#include <iostream> #include <exception> using namespace std; class newException : public exception { virtual const char* what() const throw() { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << 'n'; } return 0; }
输出:
这是代码的屏幕截图:
代码说明:
在我们的程序中包含iostream头文件。我们将使用其功能而不会出错。
在我们的程序中包括异常头文件。我们将使用其功能,例如没有错误的功能。
在我们的程序中包含std名称空间,以使用其类而不调用它。
创建一个名为newException的新类。此类继承C ++的异常类。
类主体的开始。
覆盖在异常头文件中定义的虚拟成员函数what()。然后,我们将描述我们自己的异常,即新异常。
启动新异常的定义。
如果捕获到新的异常,则返回的消息。
新异常的定义结束。
类newException的主体的结尾。newex是用于捕获新异常的名称,此后将调用newException。
调用main()函数。程序逻辑应添加在其主体内。{表示其主体的开始。
使用try语句标记需要标记异常的代码。{标记为try / catch块主体的开始。与此相关的代码将受到保护。
如果发现newex异常,则将其引发。
尝试结束。
使用catch语句捕获异常。异常错误消息将存储在变量ex中。
在控制台上打印异常错误消息。
catch语句的主体结尾。
如果程序成功执行,则应返回一个值。
main()函数主体的结尾。
概要:
使用C ++中的异常处理,您可以处理运行时错误。
运行时错误是程序执行期间发生的错误。
异常处理可帮助您处理程序中的任何意外情况。
当发生意外情况时,程序控制将转移到处理程序。
要捕获异常,可以在try-catch块下放置一段代码。
throw关键字可帮助程序抛出异常,从而帮助程序处理问题。
try关键字有助于标识将为其激活某些异常的代码块。
我们可以覆盖异常头文件的what()函数来定义我们的异常。
作者介绍