最近在学习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()函数相关推荐

  1. 【iOS架构】iOS ReactiveCocoa函数响应式编程

    声明式编程 声明式编程(declarative programming)是一种编程范型,与命令式编程相对立.它描述目标的性质,让电脑明白目标,而非流程.声明式编程不用告诉电脑问题领域,从而避免随之而来 ...

  2. iOS SQLite函数总结

    1.打开数据库 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 **ppDb          // 数据库实例 ); 2. ...

  3. ios main函数之前的操作_添加函数在ARM在进入main函数之前

    在main函数之前,程序进入Reset_Handler[WEAK],可以通过重新定义Reset_Handler添加我们需要在main之前所执行的函数. 在ARM CC的Reset_Handler中,程 ...

  4. iOS --- 数学函数 Math Functions

    iOS_数学函数Math Functions floor/ceil/round  向下取整/向上取整/四舍五入 取整实例1: double d1 =10.12, d2 = 10.88; float f ...

  5. h5怎么区分在ios、安卓、微信环境下?怎么调用原生函数

    第一步:建立dieu.js文件,创建全局变量DEVICE_TYPE //兼容页面字体 ;(function flexible (window, document) {function isMobile ...

  6. dart系列之:dart语言中的函数

    文章目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函 ...

  7. ios开发问题汇总(一)

    教程汇总 IOS比较好的网络教程:IOS编程浅蓝教程 IOS编程教程(五)自定义UITableView的表单元格 菜鸟教程-iOS教程 开发问题 实现页面切换,网上某些文章写的是: [self.nav ...

  8. glTexImage2D 函数详解

    glTexImage2D 函数详解 参考 https://blog.csdn.net/jeffasd/article/details/78135588 版权 jeffasd glTexImage2D ...

  9. C++的tie()函数

    链接:http://tech.quarkjoker.com/2011/06/22/C++%E7%9A%84tie()%E5%87%BD%E6%95%B0 今天看C ++ primer 时,看到了iOS ...

最新文章

  1. 【带你重拾Redis】Redis过期策略 和 内存淘汰策略(key回收)
  2. HBase shell 命令执行
  3. [LeetCode]*105.Construct Binary Tree from Preorder and Inorder Traversal
  4. go语言有哪些劣势?
  5. jQuery.protoype.xxx=function(){}
  6. snmp 获得硬件信息_信息系统项目管理师(三)
  7. python界面编程pdf_Python Qt GUI快速编程——PyQt编程指南 中文pdf完整版[99MB]
  8. android第一行代码-6.自定义控件的实现
  9. Java实现分页的几种方式
  10. 社区保密计算机使用制度,社区保密工作制度.doc
  11. win10隐藏任务栏_你真的了解任务栏吗?win10任务栏居然隐藏了这么多小窍门
  12. 局域网怎么修改其它计算机ip,电脑局域网怎么更改ip
  13. Unicode编码详解(一):Unicode简介及其分类
  14. 二进制文件是什么?到底二进制文件和纯文本文件的区别是什么?为什么图像、音频是二进制文件?
  15. PS像素,分辨率的概念
  16. 学会Python到底工作三年却被实习生抢了饭碗,有多吃香?
  17. Axure 中继器表格背景颜色交替不成功
  18. Unity 触摸事件的运用
  19. C语言表驱动法编程实践
  20. 4.使用Keras和Tensorflow Hub对电影评论进行文本分类

热门文章

  1. php的mvc设计模式,什么是MVC设计模式?,
  2. Emgucv图像处理二
  3. ajax get传递数组参数吗,ajax 传递数组参数
  4. Dubbo(一):Dubbo 3.0
  5. 喂养三种宠物:猫、狗和鸟
  6. 数据结构之顺序表的删除、查找、遍历
  7. 《论文阅读笔记》Attention Bottlenecks for Multimodal Fusion
  8. C ++ 程序调用CUDA静态库
  9. 联合索引和单个索引的区别:
  10. LabVIEW通讯-TCP