OpenGL着色器代码中有这样一段代码。我看了很多博客,发现对这个函数返回值有些误解。
vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
try
{
// 打开文件
vShaderFile.open(vertexPath);
fShaderFile.open(fragmentPath);
std::stringstream vShaderStream, fShaderStream;
// 读取文件的缓冲内容到数据流中
vShaderStream << vShaderFile.rdbuf();
fShaderStream << fShaderFile.rdbuf();
// 关闭文件处理器
vShaderFile.close();
fShaderFile.close();
// 转换数据流到string
vertexCode = vShaderStream.str();
fragmentCode = fShaderStream.str();
}
catch(std::ifstream::failure e)
{
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
}
查了cppreference
可以看出 ios::exception返回设置的掩码状态,如果流状态和设置掩码状态(failbit和badbit)相同,则会抛出异常,这也是上述代码没有throw的原因。
测试样例。
#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;
std::cout << std::cin.exceptions() << std::endl;
std::cout << std::cin.rdstate() << 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时,exception返回设置的掩码状态为3,流状态为goodbit(0),输入为字符时,触发异常,exception返回3,rdstate函数返回值为2.