(八)boost库之异常处理
(八)boost库之异常处理
当你面对上千万行的项目时,当看到系统输出了异常信息时,你是否想过,如果它能将文件名、行号等信息输出,该多好啊,曾经为此绞尽脑汁。
今天使用boost库,将轻松的解决这个问题。
1、boost异常的基本用法
先看看使用STL中的异常类的一般做法:
// 使用STL定义自己的异常
class MyException : public std::exception
{
public:
MyException(const char * const &msg):exception(msg)
{
}
MyException(const char * const & msg, int errCode):exception(msg, errCode)
{
}
};
void TestException()
{
try
{
throw MyException("error");
}
catch(std::exception& e)
{
std::cout << e.what() << std::endl;
}
}
boost库的实现方案为:
//使用Boost定义自己的异常
#include <boost/exception/all.hpp>
class MyException : virtual public std::exception,virtual public boost::exception
{
};
//定义错误信息类型,
typedef boost::error_info<struct tag_err_no, int> err_no;
typedef boost::error_info<struct tag_err_str, std::string> err_str;
void TestException()
{
try
{
throw MyException() << err_no(10) << err_str("error");
}
catch(std::exception& e)
{
std::cout << *boost::get_error_info<err_str>(e) << std::endl;
}
}
boost库将异常类和错误信息分离了,使得错误信息可以更加灵活,其中typedef boost::error_info<struct tag_err_no, int> err_no;
定义一个错误信息类,tag_err_no无实际意义,仅用于标识,为了让同一类型可以实例化多个错误信息类而存在。
2、使用boost::enable_error_info将标准异常类转换成boost异常类
class MyException : public std::exception{};
#include <boost/exception/all.hpp>
typedef boost::error_info<struct tag_err_no, int> err_no;
typedef boost::error_info<struct tag_err_str, std::string> err_str;
void TestException()
{
try
{
throw boost::enable_error_info(MyException()) << err_no(10) << err_str("error");
}
catch(std::exception& e)
{
std::cout << *boost::get_error_info<err_str>(e) << std::endl;
}
}
有了boost的异常类,在抛出异常时,可以塞更多的信息了,如函数名、文件名、行号。
3、使用BOOST_THROW_EXCEPTION让标准的异常类,提供更多的信息
// 使用STL定义自己的异常
class MyException : public std::exception
{
public:
MyException(const char * const &msg):exception(msg)
{
}
MyException(const char * const & msg, int errCode):exception(msg, errCode)
{
}
};
#include <boost/exception/all.hpp>
void TestException()
{
try
{
//让标准异常支持更多的异常信息
BOOST_THROW_EXCEPTION(MyException("error"));
}
catch(std::exception& e)
{
//使用diagnostic_information提取所有信息
std::cout << boost::diagnostic_information(e) << std::endl;
}
}
我们几乎不用修改以前的异常类,就能让它提供更多的异常信息。
(八)boost库之异常处理的更多相关文章
- boost库学习之开篇
本系列文章使用boost_1.58.0版本. 一.欢迎使用boost C++库 boost致力于提供一个免费的.便携的源代码级的库. 我们重视那些与C++标准一起工作良好的库.boost库将要成为一个 ...
- (三)Boost库之字符串处理
(三)Boost库之字符串处理 字符串处理一直是c/c++的弱项,string_algo库很好的弥补了这一点. string_algo 库算法命名规则: 前缀i : 有这个前缀表名算法的大小写不 ...
- (九)boost库之文件处理filesystem
(九)boost库之文件处理filesystem filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能 ...
- (一)boost库之日期、时间
(一)boost库之日期.时间 一.计时器 计时器,通常在一个项目中统计一个函数的执行时间是非常实用的. #include <boost/timer.hpp> void PrintU ...
- boost库的安装,使用,介绍,库分类
1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...
- vs2013给项目统一配置boost库
1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...
- [C/C++] C/C++延伸学习系列之STL及Boost库概述
想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...
- dev c++ Boost库的安装
dev c++ 的boost库的安装步骤 然后点击“check for updates”按钮 最后点击“Download selected”按钮,下载完成后安装.... 给dev添加boost库文件, ...
随机推荐
- Spring MVC对象转换说明
在Spring MVC之前我们需要在Servlet里处理HttpServletRequest参数对象,但这个对象里的属性都是通用类型的对象(如字符串),处理起来很繁琐并且容易出错,而Spring MV ...
- Jquery时间快捷控件(Jtime)配置v1.0
1.脚本代码行 /** * @title 时间工具类 * @note 本类一律违规验证返回false * @author {boonyachengdu@gmail.com} * @date 2013- ...
- POJ3026(BFS + prim)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10554 Accepted: 3501 Descri ...
- vhd镜像格式及vhd-util工具应用
概述 VHD 是微软虚拟磁盘文件格式,qemu和tapdisk2都能支持VHD镜像格式,不仅提供基本的虚拟机卷功能,还可提供磁盘快照.磁盘扩容等高级功能 vhd-util是个linux下的开源软件,通 ...
- Libgdx开发ios游戏
今天亲自尝试了LibGDX如何开发ios游戏, 必须条件: 1:mac操作系统,mac下必须安装Xcode 好像ios开发必须在mac操作系统下 2:mac下安装eclipse 3:eclip ...
- vs在线工具杂烩
http://visualstudiogallery.msdn.microsoft.com/site/search?f%5B0%5D.Type=RootCategory&f%5B0%5D.Va ...
- Codevs1992题解
题目大意 求有向图中经过某一点k的最大环(数据规模不支持floyd). 题解 以k为起点在正向图中spfa求单源最短路.再在反向图中spfa求单源最短路. 枚举除k外的每个点i.假设有一个同一时候包括 ...
- 【设计模式:单例模式】使用单例模式载入properties文件
先准备測试程序: package org.jediael.util; import static org.junit.Assert.*; import org.junit.Test; public c ...
- 【巧妙算法系列】【UVA 11384】 Help is needed for Dexter 正整数序列
Help is needed for Dexter Time Limit: 3 Second Dexter is tired of Dee Dee. So he decided to keep Dee ...
- Linux常见目录作用
Linux中一切皆文件 文件类型: 一般文件 - 目录文件 d 链接文件 l 块设备 b (以块为单位进行操作,比如硬盘) 字符设备 c (以字符为单位进行操作,比如主存) socket ...