首页 > 编程语言 >c++标准库笔记:13.4.4 Stream的状态和异常

c++标准库笔记:13.4.4 Stream的状态和异常

时间:2022-12-07 15:33:24浏览次数:55  
标签:std cout Stream ios cin c++ exceptions 13.4 异常


设置触发异常

Stream缺省的情况下不抛出异常,但可由成员函数exceptions来设置这种行为。

exceptions有两种形式:

  • 获取引发异常的标志(不带参数)
  • 设置引发异常的标志(带参数)
// This method is not used in msvcm80.dll, so we do not need to compile it.
// Also, if we never change the exception mask, we ensure the clear() method
// will never throw any exception. See VSW#476338 for details.
iostate __CLR_OR_THIS_CALL exceptions() const
{ // return exception mask
return (_Except);
}

void __CLR_OR_THIS_CALL exceptions(iostate _Newexcept)
{ // set exception mask to argument
_Except = (iostate)((int)_Newexcept & (int)_Statmask);
clear(_Mystate);
}

比如​​strm.exceptions( std::ios::eofbit )​​​表示当Stream被设定了eofbit状态,就触发异常,异常类型为​​std::ios_base::failure​

注:在调用exceptions设置触发异常的标志位,如果这个异常标志位已经在调用之前被设置了,此时就会立刻抛出异常。以上代码已说明一切,exceptions内部会调用​​clear(_Mystate)​​来对原来的状态位重新设置下,从而触发异常。

使用异常的注意事项

Stream在读取数据至end-of-file时,不仅设置ios::eofbit,而且还会设置ios::failbit。所以,当发生异常时,要注意使用成员函数​​eof()​​来区分到底是哪类异常。

try
{
cin.clear();
cin.exceptions( std::ios::eofbit | std::ios::failbit );
int a = 0;
while( cin >> a )
{
cout << a << endl;
}
}
catch( const std::ios_base::failure& e )
{
cout << "ios_base::failure occurred: " << e.what() << endl;
if ( cin.eof() )
{
cout << "end-of-file exception" << endl;
}
}
catch( ... )
{
cout << "unexpected exception" << endl;
}

以上例子演示了如何区分异常类型(在windows可通过​​Ctrl-Z​​​来产生end-of-file,在linux/unix下通过​​Ctrl-D​​)。

检测错误+异常

我们可以结合错误检测与异常的方式,来使用自定义错误信息。通过Stream的成员函数​​eof()​​​、​​fail()​​​、​​bad()​​来检测出错误,然后抛出自己的错误消息。

try
{
int a = 0;
while( cin >> a )
{
cout << a << endl;
}

if ( cin.eof() )
{
throw std::ios::failure("custom error information: "
"end-of-file have been occurred");
}
}
catch( const std::ios_base::failure& e )
{
cout << e.what() << endl;

}
catch( ... )
{
cout << "unexpected exception" << endl;
}


标签:std,cout,Stream,ios,cin,c++,exceptions,13.4,异常
From: https://blog.51cto.com/u_15905375/5919613

相关文章

  • 注意!!一定要谨慎使用c/c++原生指针
    主要是顶层逻辑中引用了一个指针,而在业务逻辑中将此指针删除了。这种在代码量很少的情况下,很容易被发现,但是代码量多了,逻辑多了的时候,想一下子定位到问题所在,就没那么容易了......
  • C++11 STL 完美转发
    http://m.biancheng.net/view/7868.htmlC++11标准为C++引入右值引用语法的同时,还解决了一个C++98/03标准长期存在的短板,即使用简单的方式即可在函数模板中实现参数......
  • C++——map设置两个value的方法
    方法:方法一:​​std::multimap<string,pair<int,int>>mulmap;​​方法二:​​std::multimap<string,vector<int>>mulmap;​​相关用法:​​C++——pair用法​​......
  • C++——引用&的功能及与指针*的区别
    C++——引用&的功能及与指针*的区别​​一、引用&的功能​​​​二、与指针*的区别​​​​三、真实案例​​​​参考资料​​一、引用&的功能用于函数传递参数,实现改变某个......
  • Vscode——windows系统搭建C/C++开发环境
    VSCode——windows系统搭建C/C++开发环境​​一、搭建C开发环境​​​​1.安装MinGW​​​​2.配置文件​​​​二、搭建C++开发环境​​​​1.安装MinGW​​​​2.配置文......
  • C++——cv::Rect数据结构详解
    成员rect.tl()//矩形左上角点的坐标rect.br()//矩形右下角点的坐标rect.size()//矩形的大小rect.area()//矩形的面积rect.empty()//判断矩形是否为空rect.contains()//判......
  • C++ 读写文本文件
    1.逐行读文本,文本以空格分隔points.txt文件内容如下:indexx1y1x2y202473722646141224158246400238926440750934664349028943337949618......
  • Stream操作双列集合
    双列集合:转换成单列集合后再创建Map<String,Integer>map=newHashMap<>();map.put("蜡笔小新",19);map.put("黑子",17);map.put("......
  • Java8的Stream流如此强大,你知道它的原理吗
    ......
  • C++_动态链接库和搜索共享库
    标准1998 C++982011 C++11ISO/IEC14882:2011 2014 C++142017 C++172020 ISOC++委员会正式发布了C++20标准,命名为ISO/IEC14882:2020 实现01.命令查看自己......