2014-05-22 78 views
2

我想做到以下幾點:如何將消息追加到std :: exception?

std::string fileName = "file"; 
std::ifstream in(fileName.c_str()); 
in.exceptions(std::istream::failbit); 

try 
{ 
    loadDataFrom(in); 
} 
catch (std::ios_base::failure& exception) 
{ 
    std::string location = std::string(" in file\n") + fileName; 
    // append the "location" to the error message; 
    throw; 
} 

我如何追加錯誤消息的異常?

回答

3

你可以拋出一個新的異常,與擴充消息:

throw std::ios_base::failure(exception.what() + location, 
          exception.code()); 

編輯:第二個參數exception.code()是從C++ 11。

第2編輯:請注意,如果您發現的例外情況來自std::ios_base::failure的子類,那麼您將失去其中的一部分,並使用我的建議。

+0

謝謝!但是如果catch子句捕獲一個只能繼承'std :: ios_base :: failure'的異常呢?在附加消息的同時,我能以某種方式受益於'throw;'的多態行爲嗎? –

+0

@MartinDrozdik你是對的。但我認爲沒有辦法做到這一點。 'std :: exception'中的'what()'函數不提供修改文本的方法。 – lrineau

1

我想你只能拿what()把它轉換成字符串,追加並重新拋出異常。

catch (std::ios_base::failure& exception) 
{ 
    std::string location = std::string(" in file\n") + fileName; 
    std::string error(exception.what()); 
    throw std::ios_base::failure(error+location); 
    // throw std::ios_base::failure(error+location, exception.code()); // in case of c++11 
} 

請記住,由於C++ 11失敗了第二個參數。你也想要通過它。

相關問題