我被要求使用boost :: exception创建“可自定义的异常框架”。到目前为止,我只使用了我定义的简单例外。所以std :: exception,boost :: exception对我来说是新的。代码如下。
#include <iterator>
#include<string>
#include <algorithm>
#include<errno.h>
struct My_exception:public virtual boost::exception
{
};
int main()
{
std::string fileName="tmp.txt";
std::string mode="r";
try
{
if(fopen(fileName.c_str(),mode.c_str()))
std::cout << " file opened " << std::endl ;
else
{
My_exception e;
e << boost::errinfo_api_function("fopen") << boost::errinfo_file_name(fileName)
<< boost::errinfo_file_open_mode(mode) << boost::errinfo_errno(errno);
throw e;
}
}
catch(My_exception e)
{
// extract the details here //
}
return 1;
}
现在,我想知道如何从捕获的异常中提取数据。任何人都可以在boost :: exception
的路径中引导我答案 0 :(得分:6)
首先,您的代码有错误,例如您不能写这个:
e << boost::errinfo_api_function("fopen")
因为errinfo_api_function
只能与int
一起使用。所以做这样的事情:
e << boost::errinfo_api_function(100) //say 100 is error code for api error
请参阅errinfo_api_function
1 的第二个类型参数,它是int
。同样,检查其他错误类模板。在这篇文章的最后,我给了你正在使用的每一个链接!
<子> 1。这个类模板似乎有两个版本,一个用于int
,另一个用于const char*
。将version 1.40.0 errinfo_api_function与version 1.45.0 errinfo_api_function进行比较。感谢dalle在评论中指出了这一点。 : - )子>
使用get_error_info功能模板从boost::exception
获取数据。
查看boost::exception文档说明的内容,
从中检索数据 boost :: exception对象,使用 get_error_info函数模板。
示例代码:
//since second type of errinfo_file_name is std::string
std::string fileError = get_error_info<errinfo_file_name>(e);
//since second type of errinfo_errno is int
int errno = get_error_info<errinfo_errno>(e);
//since second type of errinfo_file_open_mode is std::string
std::string mode = get_error_info<errinfo_file_open_mode>(e);
//since second type of errinfo_api_function is int
int apiError = get_error_info<errinfo_api_function>(e);
为了更好地理解,请参阅以下内容: