当前位置:网站首页>system_error错误处理库学习
system_error错误处理库学习
2022-08-02 09:07:00 【班公湖里洗过脚】
在程序开发时,我们有时遇到程序出错了,但不知道具体的原因,莫名其妙的就崩溃了,其实标准库提供了一个系统错误的库,我们可以使用这个system_error库来了解错误的提示。它不仅提供错误码code(),还提供错误类别category(),错误信息message()等相关接口。
成员函数
构造一个 error_code (公开成员函数) | |
赋值为另一 error_code (公开成员函数) | |
赋值为另一 error_code (公开成员函数) | |
修改器 | |
设 error_code 为 system_category 中的值 0 (公开成员函数) | |
观察器 | |
获得 error_code 的值 (公开成员函数) | |
获得此 error_code 的 error_category (公开成员函数) | |
获得此 error_code 的 error_condition (公开成员函数) | |
获得此 error_code 的解释性字符串 (公开成员函数) | |
检查值是否非零 (公开成员函数) |
下面是具体的示例:
//error_code observers: value, category and message
#include <iostream> //std::cout, std::ios
#include <system_error> //std::system_error
#include <fstream> //std::ifstream
#include <string> //std::string
using std::cout;
using std::ios;
using std::endl;
using std::system_error;
using std::ifstream;
using std::string;
int main()
{
std::error_code code;
cout << "Code: " << code.value() << endl;
cout << "Category: " << code.category().name() << endl;
cout << "Message: " << code.message() << endl;
cout << "default_error_condition: " << code.default_error_condition().message() << endl;
cout << "bool: " << code.operator bool() << endl;
cout << "Hello World!" << endl;
return 0;
}
运行结果:
上面是创建一个error_code 对象,程序正常运行,根据上面的结果可以看没程序正常没有错误。
下面我们来看一个异常的程序。
//error_code observers: value, category and message
#include <iostream> //std::cout, std::ios
#include <system_error> //std::system_error
#include <fstream> //std::ifstream
#include <string> //std::string
using std::cout;
using std::ios;
using std::endl;
using std::system_error;
using std::ifstream;
using std::string;
int main()
{
ifstream is;
is.exceptions(std::ios::failbit);
try {
is.open("unexistent.txt");
} catch (const std::system_error &e) {
cout << "Exception caught (system_error):\n" << endl;
cout << "Error: " << e.what() << endl;
cout << "Code: " << e.code().value() << endl;
cout << "Category: " << e.code().category().name() << endl;
cout << "Message: " << e.code().message() << endl;
cout << "default_error_condition: " << e.code().default_error_condition().message() << endl;
cout << "bool: " << e.code().operator bool() << endl;
cout << endl;
}
cout << "Hello World!" << endl;
return 0;
}
运行结果:
打开一个不存在的文件,出现了异常,从上面的异常提示我们知道这是输入输出流错误。
接着,我们把这个错误对象赋给第一个程序创建的一个空的错误类对象。查看他的信息。
//error_code observers: value, category and message
#include <iostream> //std::cout, std::ios
#include <system_error> //std::system_error
#include <fstream> //std::ifstream
#include <string> //std::string
using std::cout;
using std::ios;
using std::endl;
using std::system_error;
using std::ifstream;
using std::string;
int main()
{
std::error_code code;
cout << "Code: " << code.value() << endl;
cout << "Category: " << code.category().name() << endl;
cout << "Message: " << code.message() << endl;
cout << "default_error_condition: " << code.default_error_condition().message() << endl;
cout << "bool: " << code.operator bool() << endl;
cout << endl;
ifstream is;
is.exceptions(std::ios::failbit);
try {
is.open("unexistent.txt");
} catch (const std::system_error &e) {
cout << "Exception caught (system_error):\n" << endl;
cout << "Error: " << e.what() << endl;
cout << "Code: " << e.code().value() << endl;
cout << "Category: " << e.code().category().name() << endl;
cout << "Message: " << e.code().message() << endl;
cout << "default_error_condition: " << e.code().default_error_condition().message() << endl;
cout << "bool: " << e.code().operator bool() << endl;
cout << endl;
// operator= 操作
code = e.code();
cout << "Code: " << code.value() << endl;
cout << "Category: " << code.category().name() << endl;
cout << "Message: " << code.message() << endl;
cout << "default_error_condition: " << code.default_error_condition().message() << endl;
cout << "bool: " << code.operator bool() << endl;
cout << endl;
}
cout << "Hello World!" << endl;
return 0;
}
运行结果:
e和code两个错误对象的信息相同,接下来再调用clear函数,把信息内容清空
//error_code observers: value, category and message
#include <iostream> //std::cout, std::ios
#include <system_error> //std::system_error
#include <fstream> //std::ifstream
#include <string> //std::string
using std::cout;
using std::ios;
using std::endl;
using std::system_error;
using std::ifstream;
using std::string;
int main()
{
std::error_code code;
cout << "Code: " << code.value() << endl;
cout << "Category: " << code.category().name() << endl;
cout << "Message: " << code.message() << endl;
cout << "default_error_condition: " << code.default_error_condition().message() << endl;
cout << "bool: " << code.operator bool() << endl;
cout << endl;
ifstream is;
is.exceptions(std::ios::failbit);
try {
is.open("unexistent.txt");
} catch (const std::system_error &e) {
cout << "Exception caught (system_error):\n" << endl;
cout << "Error: " << e.what() << endl;
cout << "Code: " << e.code().value() << endl;
cout << "Category: " << e.code().category().name() << endl;
cout << "Message: " << e.code().message() << endl;
cout << "default_error_condition: " << e.code().default_error_condition().message() << endl;
cout << "bool: " << e.code().operator bool() << endl;
cout << endl;
// operator= 操作
code = e.code();
cout << "Code: " << code.value() << endl;
cout << "Category: " << code.category().name() << endl;
cout << "Message: " << code.message() << endl;
cout << "default_error_condition: " << code.default_error_condition().message() << endl;
cout << "bool: " << code.operator bool() << endl;
cout << endl;
//调用clear()
code.clear();
cout << "Code: " << code.value() << endl;
cout << "Category: " << code.category().name() << endl;
cout << "Message: " << code.message() << endl;
cout << "default_error_condition: " << code.default_error_condition().message() << endl;
cout << "bool: " << code.operator bool() << endl;
cout << endl;
}
cout << "Hello World!" << endl;
return 0;
}
运行结果:
code对象又恢复到初始状态了。
我们也可以对错误码对像进行hash:
//error_code observers: value, category and message
#include <iostream> //std::cout, std::ios
#include <system_error> //std::system_error
#include <fstream> //std::ifstream
#include <string> //std::string
using std::cout;
using std::ios;
using std::endl;
using std::system_error;
using std::ifstream;
using std::string;
int main()
{
ifstream is;
is.exceptions(std::ios::failbit);
try {
is.open("unexistent.txt");
} catch (const std::system_error &e) {
cout << "Exception caught (system_error):\n" << endl;
cout << "Error: " << e.what() << endl;
cout << "Code: " << e.code().value() << endl;
cout << "Category: " << e.code().category().name() << endl;
cout << "Message: " << e.code().message() << endl;
cout << "default_error_condition: " << e.code().default_error_condition().message() << endl;
cout << "bool: " << e.code().operator bool() << endl;
cout << endl;
std::hash<std::error_code> hashErrorCode;
cout << "hash(error_code): " << hashErrorCode(e.code()) << endl;
}
cout << "Hello World!" << endl;
return 0;
}
运行结果:
hash这是一个结构体模板,它不仅可以对错误码对象进行hash也可以对数值进行hash,比如int, long long, float, double,string等,下面来看一个示例:
//error_code observers: value, category and message
#include <iostream> //std::cout, std::ios
#include <system_error> //std::system_error
#include <fstream> //std::ifstream
#include <string> //std::string
using std::cout;
using std::ios;
using std::endl;
using std::system_error;
using std::ifstream;
using std::string;
int main()
{
ifstream is;
is.exceptions(std::ios::failbit);
try {
is.open("unexistent.txt");
} catch (const std::system_error &e) {
cout << "Exception caught (system_error):\n" << endl;
cout << "Error: " << e.what() << endl;
cout << "Code: " << e.code().value() << endl;
cout << "Category: " << e.code().category().name() << endl;
cout << "Message: " << e.code().message() << endl;
cout << "default_error_condition: " << e.code().default_error_condition().message() << endl;
cout << "bool: " << e.code().operator bool() << endl;
cout << endl;
std::hash<std::error_code> hashErrorCode;
cout << "hash(error_code): " << hashErrorCode(e.code()) << endl;
string str = "hello world!";
std::hash<string> hashStr;
cout << "hash(string): " << hashStr(str) << endl;
int n = 100;
std::hash<int> hashN;
cout << "hash(int): " << hashN(n) << endl;
long long ln = 100;
std::hash<long long> hashLn;
cout << "hash(long long): " << hashLn(ln) << endl;
double dou = 100;
std::hash<double> hashD;
cout << "hash(double): " << hashD(dou) << endl;
float f = 100;
std::hash<float> hashF;
cout << "hash(float): " << hashF(f) << endl;
}
cout << "Hello World!" << endl;
return 0;
}
运行结果:
参考:
边栏推荐
- MySQL安装与卸载详细教程
- pnpm: Introduction
- 动态规划每日一练(2)
- Pycharm (1) the basic use of tutorial
- Fiddler(七) - Composer(组合器)克隆或者修改请求
- PyCharm usage tutorial (detailed version - graphic and text combination)
- WebGPU 导入[1] - 入门常见问题与个人分享
- ORBSLAM代码阅读
- Jenkins--基础--5.4--系统配置--全局工具配置
- (Note) AXIS ACASIS DT-3608 Dual-bay Hard Disk Array Box RAID Setting
猜你喜欢
The packet capture tool Charles modifies the Response step
软件exe图标变记事本或浏览器、360压缩打不开的几种应急解决方法
EPSANet: An Efficient Pyramid Split Attention Block on Convolutional Neural Network
Jenkins--基础--6.1--Pipeline--介绍
Overview of Edge Computing Open Source Projects
spark:热门品类中每个品类活跃的SessionID统计TOP10(案例)
How to use postman
spark:商品热门品类TOP10统计(案例)
(Note) AXIS ACASIS DT-3608 Dual-bay Hard Disk Array Box RAID Setting
Talk about the understanding of Volatile
随机推荐
AutoJs学习-实现谢尔宾斯基三角
百数应用中心——选择一款适合企业的标准应用
Jetpack Compose 中的状态管理
Jenkins--基础--6.3--Pipeline--语法--脚本式
查看变量的数据格式
day_05模块
Jenkins--基础--6.1--Pipeline--介绍
四字节的float比八字结的long范围大???
深度学习汇报(4)
每天花2小时恶补腾讯T8纯手打688页SSM框架和Redis,成功上岸美团
JSP页面中page指令有哪些属性及方法可使用呢?
C语言_指针
了解下C# 多线程
被报表需求逼疯的银行数据人,是时候放弃用Excel做报表了
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路
day_05_pickel 和 json
曲折的tensorflow安装过程(Tensorflow 安装问题的解决)
谈谈对Volatile的理解
mysql进阶(二十一)删除表数据与数据库四大特性
pycharm的基本使用教程(1)