ios::exceptions()函数
最近在学习OpenGL的时候,在shader保存到本地文件,读取shader文件的时候,碰到了如下形式的函数:
std::ifstream vShaderFile;vShaderFile.exceptions(std::ifstream::failbit|std::ifstream::badbit);try
{//进行了一系列操作,但没有包含thrwo的函数;
}
catch(std::ifstream::failure e)
{std::cout<<"ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ"<<std::endl;
}
由于本人C++功底也不好,以上代码有两点不太明白
1.vShaderFile.exceptions 这个函数是啥?
2.try语句中没有throw语句,catch语句应该去捕获什么异常?
在查阅了c++Reference之后,大致明白。 现在整理如下:
针对第一个问题:什么是exceptions
这是一个ios流的成员函数:std::ios::exceptions。
他有两种重载的形式:
/*get(1)*/ iostate exceptions() const;
/*set(2)*/ void exceptions (iostate except);
根据注释可以很明显的看出,
The first form (1) returns the current exception mask for the stream.
The second form (2) sets a new exception mask for the stream and clears the stream’s error state flags (as if member clear() was called).
1是用来得到当前流的状态的,会返回诸如 goodbit,badbit,eofbit,failbit。
2是用来设置一个新的状态掩码,同时会清除流的状态标志。当流的状态变成所设置的状态的时候,就会抛出一个异常。这也是为什么在try中没有thrwo语句,而catch语句还能正常捕获的原因。
值得注意,流默认设置的状态掩码是 goodbit,所以当流出错的时候,不会主动抛出异常哦。
现在测试如下:
测试1
#include<iostream>
#include<string>int main()
{std::cin.exceptions(std::ios::failbit);//这里只设置了一个failbit的flagtry{int test;while (std::cin >> test)std::cout << test << std::endl;}catch (std::ios::failure e){std::cerr << "Wrong" << std::endl;std::cout << std::cin.exceptions() << std::endl;std::cout << std::cin.rdstate() << std::endl;}return 0;
}
可以看到当输入不是int的a的时候,while的条件cin>>test抛出了一个错误,并被catch,
cin.exceptions返回的是2,
cin.rdstate返回的也是2,可以知道抛出以及捕获的过程中,并不会修正这个错误位。
测试2
#include<iostream>
#include<string>int main()
{std::cin.exceptions(std::ios::failbit|std::ios::eofbit);try{int test;while (std::cin >> test)std::cout << test << std::endl;}catch (std::ios::failure e){std::cerr << "Wrong" << std::endl;std::cout << std::cin.exceptions() << std::endl;std::cout << std::cin.rdstate() << std::endl;}return 0;
}
这次测试数据和上次相同,但多设置了一个eofbit位置。
cin.exceptions返回的是3,和之前的2不同,说明cin.exceptions返回的是设置的异常掩码的状况;
cin.rdstate返回的和上次相同。
可见上述的“同时会清除流的状态标志”的意思是把之前设置的状态标识覆盖掉,改为现在设置的标志。
ios::exceptions()函数相关推荐
- 【iOS架构】iOS ReactiveCocoa函数响应式编程
声明式编程 声明式编程(declarative programming)是一种编程范型,与命令式编程相对立.它描述目标的性质,让电脑明白目标,而非流程.声明式编程不用告诉电脑问题领域,从而避免随之而来 ...
- iOS SQLite函数总结
1.打开数据库 int sqlite3_open( const char *filename, // 数据库的文件路径 sqlite3 **ppDb // 数据库实例 ); 2. ...
- ios main函数之前的操作_添加函数在ARM在进入main函数之前
在main函数之前,程序进入Reset_Handler[WEAK],可以通过重新定义Reset_Handler添加我们需要在main之前所执行的函数. 在ARM CC的Reset_Handler中,程 ...
- iOS --- 数学函数 Math Functions
iOS_数学函数Math Functions floor/ceil/round 向下取整/向上取整/四舍五入 取整实例1: double d1 =10.12, d2 = 10.88; float f ...
- h5怎么区分在ios、安卓、微信环境下?怎么调用原生函数
第一步:建立dieu.js文件,创建全局变量DEVICE_TYPE //兼容页面字体 ;(function flexible (window, document) {function isMobile ...
- dart系列之:dart语言中的函数
文章目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函 ...
- ios开发问题汇总(一)
教程汇总 IOS比较好的网络教程:IOS编程浅蓝教程 IOS编程教程(五)自定义UITableView的表单元格 菜鸟教程-iOS教程 开发问题 实现页面切换,网上某些文章写的是: [self.nav ...
- glTexImage2D 函数详解
glTexImage2D 函数详解 参考 https://blog.csdn.net/jeffasd/article/details/78135588 版权 jeffasd glTexImage2D ...
- C++的tie()函数
链接:http://tech.quarkjoker.com/2011/06/22/C++%E7%9A%84tie()%E5%87%BD%E6%95%B0 今天看C ++ primer 时,看到了iOS ...
最新文章
- 【带你重拾Redis】Redis过期策略 和 内存淘汰策略(key回收)
- HBase shell 命令执行
- [LeetCode]*105.Construct Binary Tree from Preorder and Inorder Traversal
- go语言有哪些劣势?
- jQuery.protoype.xxx=function(){}
- snmp 获得硬件信息_信息系统项目管理师(三)
- python界面编程pdf_Python Qt GUI快速编程——PyQt编程指南 中文pdf完整版[99MB]
- android第一行代码-6.自定义控件的实现
- Java实现分页的几种方式
- 社区保密计算机使用制度,社区保密工作制度.doc
- win10隐藏任务栏_你真的了解任务栏吗?win10任务栏居然隐藏了这么多小窍门
- 局域网怎么修改其它计算机ip,电脑局域网怎么更改ip
- Unicode编码详解(一):Unicode简介及其分类
- 二进制文件是什么?到底二进制文件和纯文本文件的区别是什么?为什么图像、音频是二进制文件?
- PS像素,分辨率的概念
- 学会Python到底工作三年却被实习生抢了饭碗,有多吃香?
- Axure 中继器表格背景颜色交替不成功
- Unity 触摸事件的运用
- C语言表驱动法编程实践
- 4.使用Keras和Tensorflow Hub对电影评论进行文本分类