2011-02-05 62 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