2011-09-23 34 views
1

在我的內部日誌記錄庫中,我試圖更改自定義異常類以從boost :: exception而不是std :: exception派生。我正在這樣做,以便我可以使用單個catch塊來同時處理boost異常和我的應用程序異常。但是我在記錄時遇到了一個問題。記錄boost :: exception,同時避免文件/行/函數和嘮叨

在使用boost :: diagnostic_information()記錄異常時,我得到了整個9碼的拋出位置。這些信息對我來說是多餘的,因爲我的自定義類已經以我想要的方式收集並使用了這些信息。我不想在日誌中打印源代碼文件/行/函數信息。

如果我定義BOOST_EXCEPTION_DISABLE或者不使用BOOST_THROW_EXCEPTION,它打印「投擲位置未知(考慮使用BOOST_THROW_EXCEPTION)」每次我登錄異常。

但我怎麼逃避這個嘮叨?

回答

4

好吧,我想我自己找到了答案。首先,我不必從boost :: exception派生我的類,我仍然可以繼續從std :: exception派生。不過,我應該使用BOOST_THROW_EXCEPTION拋出我的std :: exception派生類。因此它在起飛時變成boost :: exception。 :-)

在兩者之間,我可以添加更多的信息,如果需要通過捕捉和重新投擲。

typedef boost::error_info<struct tag_errmsg, std::string> exceptionInfo; 

    catch (boost::exception &e) 
    { 
    e << exceptionInfo("some more exception data"); 
    throw; 
    } 

然後我終於可以趕上並打印這種方式:

catch (boost::exception &e) 
{ 
    std::exception const * se = dynamic_cast<std::exception const *>(&e); 
    if(se) 
    { 
     // will enter here only for my application exception and not for pure boost exception 
     std::cout << "STD: " << se->what(); 
    } 
    std::cout << " BOOST: " << *boost::get_error_info<exceptionInfo>(e);  } 
} 

這樣,我將得到的std ::例外,無論是什麼()字符串,並從提升的錯誤信息: :例外。我在正確的軌道上嗎?

0

難道你不想使用exception :: what()而不是boost :: diagnostic_information()嗎?

+1

boost:exception中沒有what()函數。 – Sharath

相關問題