2011-02-05 80 views
3

我被要求使用boost :: exception创建“可定制的异常框架”。到目前为止,我只使用由我定义的简单例外。所以std :: exception,boost :: 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 ::例外

回答

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 

见第2类参数来errinfo_api_function ,这是int。同样,检查其他错误类模板。我在这篇文章的最后给出了你正在使用的每个人的链接!

1.看来这个班级模板有两个版本,一个需要int,其他需要const char*。比较version 1.40.0 errinfo_api_functionversion 1.45.0 errinfo_api_function。感谢dalle谁在评论中指出。 :-)


使用get_error_info函数模板从boost::exception获取数据。

boost::exception文档是这么说,

要从 的boost ::异常对象检索数据,使用 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); 

更好地理解看到这些:

+0

@Nawaz,我无法理解它。你可以用代码 – prabhakaran 2011-02-05 06:21:19