C ++异常处理:尝试,捕获,抛出示例

发布于:2021-01-28 11:37:51

0

261

0

C ++ 异常处理 try catch

什么是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; }

输出:

这是代码的屏幕截图:

代码说明:

  1. 在程序中包含iostream头文件以使用其功能。

  2. 将矢量头文件包含在程序中以使用其功能。

  3. 在程序中将std名称空间包括在其类中,而不调用它。

  4. 调用main()函数。程序逻辑应添加在其主体内。

  5. 创建一个名为vec的向量来存储整数数据。

  6. 将元素0添加到名为vec的向量中。

  7. 将元素1添加到名为vec的向量中。

  8. 一条评论。C ++编译器将跳过它。

  9. 使用try语句捕获异常。{标记为try / catch块主体的开始。正文中添加的代码将成为受保护的代码。

  10. 尝试访问存储在名为vec的向量的索引2(第三个元素)处的元素。该元素不存在。

  11. try / catch块的主体末端。

  12. 捕获异常。返回的错误消息将存储在变量ex中。

  13. 如果捕获到异常,请在控制台上打印一些消息。

  14. 捕获块的主体末端。

  15. 程序应在成功执行后返回一个值。

  16. 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; }

输出:

这是代码的屏幕截图:

代码说明:

  1. 在程序中包含iostream头文件以使用其功能。

  2. 在程序中将std名称空间包括在其类中,而不调用它。

  3. 创建一个名为zeroDivision的函数,该函数接受两个整数参数x和y。该函数应返回一个双精度结果。

  4. 使用if语句检查变量参数y的值是否为0。{标记if正文的开头。

  5. 如果y为0,则返回/抛出该消息。

  6. if语句的主体结尾。

  7. zeroDivision函数应返回x / y的值。

  8. zeroDivision函数的主体结尾。

  9. 调用main()方法。{表示此方法的开始。

  10. 声明一个整数变量并将其赋值为11。

  11. 声明一个整数变量b并将其赋值为0。

  12. 声明一个双精度变量c并将其赋值为0。

  13. 使用try语句捕获异常。{标记为try / catch块主体的开始。正文中添加的代码将成为受保护的代码。

  14. 调用zeroDivision函数并传递给参数a和b,即11和0。此操作的结果将存储在变量c中。

  15. 在控制台上打印出变量c的值。

  16. try / catch块的主体末端。

  17. 捕获异常。返回的错误消息将存储在变量消息中。

  18. 在控制台上打印出返回的错误消息。

  19. 捕获块的主体末端。

  20. 程序应在成功执行后返回一个值。

  21. main()函数主体的结尾。

C ++标准异常

C ++带有在<exception>类中定义的标准异常列表。如下所述:

{xunruicms_img_title}

用户定义的异常

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; }

输出:

这是代码的屏幕截图:

代码说明:

  1. 在我们的程序中包含iostream头文件。我们将使用其功能而不会出错。

  2. 在我们的程序中包括异常头文件。我们将使用其功能,例如没有错误的功能。

  3. 在我们的程序中包含std名称空间,以使用其类而不调用它。

  4. 创建一个名为newException的新类。此类继承C ++的异常类。

  5. 类主体的开始。

  6. 覆盖在异常头文件中定义的虚拟成员函数what()。然后,我们将描述我们自己的异常,即新异常。

  7. 启动新异常的定义。

  8. 如果捕获到新的异常,则返回的消息。

  9. 新异常的定义结束。

  10. 类newException的主体的结尾。newex是用于捕获新异常的名称,此后将调用newException。

  11. 调用main()函数。程序逻辑应添加在其主体内。{表示其主体的开始。

  12. 使用try语句标记需要标记异常的代码。{标记为try / catch块主体的开始。与此相关的代码将受到保护。

  13. 如果发现newex异常,则将其引发。

  14. 尝试结束。

  15. 使用catch语句捕获异常。异常错误消息将存储在变量ex中。

  16. 在控制台上打印异常错误消息。

  17. catch语句的主体结尾。

  18. 如果程序成功执行,则应返回一个值。

  19. main()函数主体的结尾。

概要:

  • 使用C ++中的异常处理,您可以处理运行时错误。

  • 运行时错误是程序执行期间发生的错误。

  • 异常处理可帮助您处理程序中的任何意外情况。

  • 当发生意外情况时,程序控制将转移到处理程序。

  • 要捕获异常,可以在try-catch块下放置一段代码。

  • throw关键字可帮助程序抛出异常,从而帮助程序处理问题。

  • try关键字有助于标识将为其激活某些异常的代码块。

  • 我们可以覆盖异常头文件的what()函数来定义我们的异常。