欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 【C++】try语句块和异常处理

【C++】try语句块和异常处理

2025/9/24 7:19:31 来源:https://blog.csdn.net/Coffeemaker88/article/details/143206549  浏览:    关键词:【C++】try语句块和异常处理

Try语句块和异常处理

这部分内容对应于C++ Primer 第五版的第 5.6 章。本科在学 C++ 时更多的是为了程序设计算法竞赛,忽略了 C++ 本身一些工程上的东西,比如此处的try语句块和异常处理,在之前 C++ 的学习过程中完全被忽略掉了。借此系统复习 C++ 的机会,对这一块知识进行补全。

在 C++ 中,异常处理包括:

  • throw 表达式(throw expression),异常检测部分使用 throw 表达式来表示它遇到了无法处理的问题。我们说 throw 引发(raise)了异常。
  • try语句块(try block),异常处理部分使用 try 语句块处理异常。try 语句块以关键字 try 开始,并以一个或多个 catch 子句(catch clause)结束。try 语句块中代码抛出的异常通常会被某个 catch 子句处理。因为 catch 子句“处理”异常,所以它们也被称为异常处理代码(exception handler)
  • 一套异常类(exception class),用于在 throw 表达式和相关的 catch 子句之间传递异常的具体信息。

throw 表达式

程序的异常检测部分使用 throw 表达式引发一个异常【听起来非常像Python当中的raise,比如raise NotImplementedError】。throw 表达式包含关键字 throw 和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw 表达式后面通常紧跟一个分号,从而构成一条表达式语句。

一个 throw 表达式的例子:

if(item.isbn() != item2.isbn()) {throw runtime_error("Data must refer to same ISBN");
}
cout << item1 + item2 << endl;

try 语句块

try 语句块的通常语法形式是:

try {program-statements
} catch (exception-declaration) {handler-statements
} catch (exception-declaration) {handler-statements
}

跟在try块之后的是一个或多个catch子句。catch子句包括三部分:关键字catch、括号内一个(可能未命名)对象的声明(称作异常声明,exception declaration)以及一个块。当选中了某个catch子句处理异常之后,执行与之对应的块。catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句继续执行。【相当于使用try处理可能发生异常的语句,如果异常发生了,根据catch当中的exception-declaration跳转执行相应catch语句块当中的内容,执行过后如果没有非正常返回,则继续执行程序,跳转到所有catch之后的第一条语句开始执行,与Python当中的异常处理方式是相同的】

try语句块当中的program-statements组成程序的正常逻辑,与其他块一样,其中可以包括声明在内的任何 C++ 语句。

编写处理代码

一个典型的异常处理代码片段如下:

while(cin >> item1 >> item2) {try {// 执行添加两个 Sales_item 对象的代码;// 如果添加失败, 代码抛出一个 runtime_error 异常if(item.isbn() != item2.isbn()) {throw runtime_error("Data must refer to same ISBN");}cout << item1 + item2 << endl;} catch (runtime_error err) {cout << err.what () << "\nTry Again? Enter y or n" << endl;char c;cin >> c;if(!cin || c == 'n') break;}
}

程序本来要执行的任务出现在try语句块当中,因为这段代码可能抛出runtime_error类型的异常。

try语句块对应一个catch子句,该子句负责处理类型为runtime_error的异常。

给用户的提示信息中输出了err.what()的返回值。我们知道err的类型是runtime_error,因此能推断whatruntime_error类的一个成员函数。

每个标准库当中的异常类都定义了名为what的成员函数,这些函数没有参数,返回值是 C 风格的字符串(const char *)。其中,runtime_errorwhat成员返回的是初始化一个具体对象时所用的string对象的副本,即Data must refer to same ISBN,如果try语句引发异常,则命令行的输出为:

Data must refer to same ISBN
Try Again? Enter y or n

函数在寻找代码的过程中退出

如果程序最终没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为与系统有关,一般来说,当执行到该函数导致时,会导致程序非正常退出。

对于没有使用try进行异常处理的语句块,我们都知道此时程序会非正常返回,此时程序就是转到了terminate退出。

标准异常

C++ 标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类可以在用户编写的程序当中使用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词