2009-10-11 186 views
3

目前,我有這樣的代碼前面加上一個「標籤」來,給了我一個堆棧跟蹤的一個很輕的版本異常消息:前面加上一個字符串到另一個字符串

try { 
    doSomething(); 
} catch (std::exception& e) { 
    int size = 8 + _tcslen(e.what()); 
    TCHAR* error = new TCHAR[size]; 
    _sntprintf(error, size, TEXT("myTag: %s"), e.what()); 
    std::exception x = std::exception(error); 
    delete []error; 
    throw x; 
} 

它只是看起來可怕的,我確定必須有一個簡單的方法來完成這一點。你能幫我解決這個問題嗎?

+5

您已經得到了字符串處理問題的答案,但我不得不說您的異常處理看起來相當可疑。你已經發現了一個異常'e',它可以是從std :: exception派生的任何類,但是你有效地切割e並丟失真正的e類型。 – 2009-10-11 12:46:07

+0

感謝您的評論。我沒有想過它,因爲我只在內部函數中拋出std :: exception。不過,我現在明白你的意思了。什麼是替代方案?直接更改內部what()文本並拋出原始異常? – Etan 2009-10-11 13:11:32

+3

*您*只能顯式拋出std :: exceptions,但STL也可以拋出。如果您只想處理自己的異常,請考慮編寫自己的異常類,以便在其中修改字符串? – 2009-10-11 14:13:56

回答

3

怎麼樣這樣的:

throw std::exception(std::string("myTag: ").append(e.what()).c_str());

添加了調用c_str()和Visual Studio的測試,它的工作原理(邊注:這並不在GCC編譯,這裏只有一個實現中的默認構造函數)。

+0

謝謝! (感覺我已經想起了將近一個小時而沒有想過std :: string的想法,這真是愚蠢的......) – Etan 2009-10-11 12:39:21

0

是的,有。

std::string S1="Hello",S2=" World"; 
S1+=S2; 
0

爲什麼不直接使用std::string。你可以做std::string s = std::string("myTag") + e.what()。如果你想char *指針使用c_str()成員函數的字符串。

3

爲什麼不使用std :: string?

try { 
    doSomething(); 
} catch (const std::exception& e) 
{ 
    throw std::exception(std::string("myTag: ") + e.what()); 
} 

其他說明: 據我所知的std ::例外沒有這種形式的構造函數(只有它的子類)。

不知道你爲什麼使用TCHAR緩衝區。可以std::exception::what曾經回報什麼,但char*?如果是這樣,也許你可以使用std::basic_string<TCHAR>

要記住的重要事項:返回const char*(無論出於何種原因)。例如,它已經想知道10或13個字符在哪裏消失了:

throw some_exception(e.what() + '\n' + moreinfo); 
+0

你是對的。 std :: exception會返回一個'virtual const char *'。 – Etan 2009-10-11 12:40:14

+0

@fnieto:你是否下調_me_,因爲OP使用這個非標準的構造函數,我甚至評論過它?至於不使用const,我想這是一種習慣的力量(我實際上不記得任何一段代碼通過教程中的const引用來捕獲它)。 – UncleBens 2009-10-11 15:27:29

+0

+1來反擊downvote..This是一個完全有效的答案。 – Naveen 2009-10-11 16:19:43

相關問題