向我介绍boost :: exception

pra*_*ran 3 c++ boost exception

我被要求使用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;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想知道如何从捕获的异常中提取数据.任何人都可以在boost :: exception的路径中引导我

Naw*_*waz 6

首先,您的代码有错误,例如您不能写这个:

e << boost::errinfo_api_function("fopen")
Run Code Online (Sandbox Code Playgroud)

因为errinfo_api_function只能用int.所以做这样的事情:

  e << boost::errinfo_api_function(100) //say 100 is error code for api error
Run Code Online (Sandbox Code Playgroud)

看第二个类型参数为1,它是.同样,检查其他错误类模板.在这篇文章的最后,我给出了你正在使用的每一个链接!errinfo_api_functionint

1.似乎这个类模板有两个版本,一个采用int,另一个需要const char*.将版本1.40.0 errinfo_api_function版本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);
Run Code Online (Sandbox Code Playgroud)

请参阅以获得更好的理解: