前面加上一个字符串到另一个字符串
目前,我有这样的代码前面加上一个“标签”来,给了我一个堆栈跟踪的一个很轻的版本异常消息:前面加上一个字符串到另一个字符串
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;
}
它只是看起来可怕的,我确定必须有一个简单的方法来完成这一点。你能帮我解决这个问题吗?
怎么样这样的:
throw std::exception(std::string("myTag: ").append(e.what()).c_str());
添加了调用c_str()和Visual Studio的测试,它的工作原理(边注:这并不在GCC编译,这里只有一个实现中的默认构造函数)。
谢谢! (感觉我已经想起了将近一个小时而没有想过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);
您已经得到了字符串处理问题的答案,但我不得不说您的异常处理看起来相当可疑。你已经发现了一个异常'e',它可以是从std :: exception派生的任何类,但是你有效地切割e并丢失真正的e类型。 – 2009-10-11 12:46:07
感谢您的评论。我没有想过它,因为我只在内部函数中抛出std :: exception。不过,我现在明白你的意思了。什么是替代方案?直接更改内部what()文本并抛出原始异常? – Etan 2009-10-11 13:11:32
*您*只能显式抛出std :: exceptions,但STL也可以抛出。如果您只想处理自己的异常,请考虑编写自己的异常类,以便在其中修改字符串? – 2009-10-11 14:13:56