C++ Primer 第五章 语句
第五章 语句
5.1 范围for语句
- 前面记录的范围for语句,形如
for(declaration:expression) statement;
其中
vector<int>v = {0,1,2,3,4,5,6};
for(auto &r : v) {
r *= 2;
}
//等价于
for(auto beg = v.begin(),end = v.end(); beg != end; beg++) {
auto &r = *beg;
r *= 2;
}
- 如上,因此不能通过范围for语句往vector中添加或删除对象,这样的结果可能使得end变得无效
5.2 try语句和异常处理
在C++中,异常处理包括
- throw表达式:异常检测部分使用throw表达式来表示他遇到了无法处理的问题,我们说throw引发(raise)了异常
- try语句块(try block):异常处理部分使用try语句块处理异常,try语句块以try开始,并以一个或多个catch字句结束。try语句块抛出的异常通常会以某个catch子句处理。因为catch子句“处理”异常,所以他们也被称作异常处理代码(exception handler)
- 一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息
5.2.1 throw表达式
- throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw表达式后面紧跟一个分号,从而构成一条表达式语句
Sale_item item1,item2;
cin >> item1 >> item2;
if(item1.S() == item2.S()) {
cout << item1.S() + item2.S() << endl;
return 0;
}else {
cout << "error" << endl;
return -1;
}
//等价于
if(item1.S() != item2.S()) {
throw runtime_error("error");
}
cout << item1 + item2 << endl;
5.2.2 try语句块
//通用语法形式
try {
program-statements;
} catch (exception-declaration) {
handler-statements;
} catch (exception-declaration) {
handle-statements;
}
如上面的例子,我们可以使用
while(cin >> item1 >> item2) {
try {
cout << item1.S() + item2.S() << endl;
break;
} catch (runtime_error err) {
cout << "err.what(), try again?" << endl;
}
}
5.2.3 标准异常
C++标准库定义了一组类用于报告标准库函数遇到的问题,这些异常类也可以在用户编写的程序中使用,他们分别定义在四个头文件中
- exception头文件,定义了最痛有的异常类exception
- stdexcept定义了集中常用的异常类
- new头文件定义了bad_alloc异常类型
- type_info定义了bad_cast异常类型
-
stdexcept定义的异常类
- exception 最常见的问题
- runtime_error 只有在运行时才能检测出的问题
- range_error 运行时错误:生成的结果超出了有意义的值域范围
- overflow_error 运行时错误:计算上溢
- underflow_error 运行时错误:计算下溢
- logic_error 程序逻辑错误
- domain_error 逻辑错误:参数对应的结果值不存在
- invalid_argument 逻辑错误:无效参数
- length_error 逻辑错误:试图创建一个超出该类型最大长度的对象
- out_of_range 逻辑错误:使用一个超出有效范围的值
-
异常类型只定义了一个名为what()的成员函数,没有任何参数,返回一个const char*,该字符串用于提供关于异常的文本信息
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库