一旦流处在一个无效的状态,它要么抛出一个异常,要么忽略后面所有施于在其上的操作,直到clear()被调用。默认地,大多数流不会在遇到问题时抛出异常。
在许多时候,你不希望抛出一个异常。然而,在处理一些要求苛刻的信息时,你可能会希望万一所读写的数据无效时抛出异常。
你可以用流的成员函数exceptions来达到这个目的。
异常标志flags可以是:
通常你会使用stream.exceptions(std::ios_base::badbit)和(std::ios_base::flagbit),它们会在输入不是你预期的格式时抛出异常。
有一种情况你会发现异常非常有用,就是在你初始化一些应用程序相关的数据时;因为如果你不能完整读出它,你就不能继续运行程序。因此,异常正好就是你所需要的:
#include <string>
#include <sstream>
struct AppData
{
int m_nMaxUsers;
int m_nAllottedTime;
std::string m_strLicenseKey;
// etc.
};
std::istream & operator >>( std::istream & streamIn, AppData
& value)
{
streamIn
>> value.m_nMaxUsers
>> value.m_nAllottedTime
>> value.m_strLicenseKey
/* etc. */
;
return streamIn;
}
void ReadAppData( AppData & appData, std::istream & streamIn)
{
streamIn.exceptions( std::ios_base::badbit | std::ios_base::failbit);
streamIn >> appData;
}
int main(int argc, char* argv[])
{
std::string strBuffer( "invalid data 3885
");
AppData appData;
try
{
/* 例如,可能是从一个文件中读出
*/
std::stringstream streamIn(
strBuffer);
ReadAppData( appData, streamIn);
/* 代码*/
}
catch ( ...)
{
/* 处理异常
*/
std::cout << "exception
occurred" << std::endl;
}
std::cin.get();
return 0;
}