(八)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库文件, ...
随机推荐
- springMVC+ freemark多视图配置
<!--通用视图解析器--> <bean id="viewResolverCommon" class="org.springframework.web. ...
- vc++ ODBC
http://book.51cto.com/art/200807/80054.htm http://www.cnblogs.com/xrong/archive/2013/04/14/3020240.h ...
- Remove Duplicates from Sorted Array 解答
Question Given a sorted array, remove the duplicates in place such that each element appear only onc ...
- 使用Memcache在PHP中调试方法的介绍及应用
使用Memcache在PHP中调试方法的介绍及应用 如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce.首先我们必须要安装,接 ...
- MSSQL 常用内置函数
一.判断表是否存在 IF objectproperty(object_id(@tableName),'IsUserTable') IS NOT NULL PRINT '存在' ELSE PRINT ' ...
- Js apply 方法 具体解释
Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...
- 关于vnc连接闪退问题的设置
设置如下: 依次点Option-->Advanced-->Expert找到ColourLevel,默认值是pal8,修改为rgb222或full.
- iOS/iPhone 程序文件目录结构以及启动流程
要想清晰的理解IOS应用程序的启动过程,毫无疑问需要深入了解一下ios应用程序的文件系统.一个ios应用程序都有一个属于自己沙盒(sandbox),应用沙盒就是文件系统目录,并且与文件系统的其他部分隔 ...
- C# winfrom 模拟ftp文件管理
从网上找到的非常好用的模拟ftp管理代码,整理了一下,希望对需要的人有帮助 using System; using System.Collections.Generic; using System.T ...
- MVC学习 (二) Razor语法
MVC的Model层我理解与三层架构的Molde没有区别,都是作为各个层之间的数据沟通桥梁.但是关于Control和View都有一些与传统webform不同的特性. 这里先学习View里所用到的Raz ...