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

2023-10-24 10:08

本文主要是介绍c++标准库笔记:13.4.4 Stream的状态和异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设置触发异常

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 maskreturn (_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;
}

这篇关于c++标准库笔记:13.4.4 Stream的状态和异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274412

相关文章

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

Java之并行流(Parallel Stream)使用详解

《Java之并行流(ParallelStream)使用详解》Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集... 目录Java并行流(Parallel Stream)1. 核心概念与原理2. 创建并行流的方式3. 适

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Java 8 Stream filter流式过滤器详解

《Java8Streamfilter流式过滤器详解》本文介绍了Java8的StreamAPI中的filter方法,展示了如何使用lambda表达式根据条件过滤流式数据,通过实际代码示例,展示了f... 目录引言 一.Java 8 Stream 的过滤器(filter)二.Java 8 的 filter、fi

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在