前面加上一个字符串到另一个字符串

问题描述:

目前,我有这样的代码前面加上一个“标签”来,给了我一个堆栈跟踪的一个很轻的版本异常消息:前面加上一个字符串到另一个字符串

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

怎么样这样的:

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

是的,有。

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

为什么不直接使用std::string。你可以做std::string s = std::string("myTag") + e.what()。如果你想char *指针使用c_str()成员函数的字符串。

为什么不使用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