实现异常来验证流

ZDNet软件频道 时间:2003-06-13 作者:翻译:Java研究组织-郭晓刚 |  我要评论()
本文关键词:cpptips
在许多时候,你不希望抛出一个异常。然而,在处理一些要求苛刻的信息时,你可能会希望万一所读写的数据无效时抛出异常。
本文译自Builder.com,未经许可请勿转载在使用STL流的时候,你有时会发现很难处理流的错误。比如,你读出的数据可能是被破坏了的。

一旦流处在一个无效的状态,它要么抛出一个异常,要么忽略后面所有施于在其上的操作,直到clear()被调用。默认地,大多数流不会在遇到问题时抛出异常。

在许多时候,你不希望抛出一个异常。然而,在处理一些要求苛刻的信息时,你可能会希望万一所读写的数据无效时抛出异常。

你可以用流的成员函数exceptions来达到这个目的。

  • stream.exceptions(std::ios_base::goodbit) ——从不抛出异常。
  • stream.exceptions(flags) ——设置异常标志;当标志“发生”时,将抛出异常。
  • stream.exceptions() ——返回异常标志。

异常标志flags可以是:

  • std::ios_base::badbit ——遇到无效的数据;例如,你试图读取一个整数,却遇到了非数字的字符。
  • std::ios_base::eofbit ——遇到文件结束。
  • std::ios_base::failbit ——下一个操作将失败。比如你打开一个文件流而底下的文件却不存在;在这种情况下,下一个操作将会失败。

通常你会使用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;
}



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134