C++ 在抛出“std::string”实例后调用terminate
我有一个二进制文件,它通过抛出std:string类型的异常而崩溃 剥离二进制文件的堆栈跟踪:C++ 在抛出“std::string”实例后调用terminate,c++,exception-handling,stack-trace,C++,Exception Handling,Stack Trace,我有一个二进制文件,它通过抛出std:string类型的异常而崩溃 剥离二进制文件的堆栈跟踪: terminate called after throwing an instance of 'std::string' *** Aborted at 1309483487 (unix time) try "date -d @1309483487" if you are using GNU date *** PC: @ 0x3fb0c30155 (unknown) *** SIGABRT
terminate called after throwing an instance of 'std::string'
*** Aborted at 1309483487 (unix time) try "date -d @1309483487" if you are using GNU date ***
PC: @ 0x3fb0c30155 (unknown)
*** SIGABRT (@0xd54) received by PID 3412 (TID 0x40d03940) from PID 3412; stack trace: ***
@ 0x3fb180de70 (unknown)
@ 0x3fb0c30155 (unknown)
@ 0x3fb0c31bf0 (unknown)
@ 0x2aaaaab80cc4 (unknown)
@ 0x2aaaaab7ee36 (unknown)
@ 0x2aaaaab7ee63 (unknown)
@ 0x2aaaaab7ef4a (unknown)
@ 0x4c2622 XYZ::connect()
@ 0x4c3e0f XYZ::refresh()
@ 0x3fb18062f7 (unknown)
@ 0x3fb0cd1e3d (unknown)
现在的问题是,refresh函数确实尝试捕获std::string。它看起来像:-
bool XYZ::refresh() {
try {
connect();
} catch (string& s) {
return false;
}
return true;
}
你知道为什么它没有被抓住吗?或者我读取的堆栈跟踪错误了吗?那就是
可能您没有重建所有源文件,或者您正在运行过期的可执行文件。可能部分或所有模块在编译时没有-fno异常?有关如何更改异常行为的详细信息,请参阅 例如,以下短程序在抛出“std::string”实例后显示terminate called,如果: 包含foo的模块编译时带有-fno异常,并且 foo调用抛出std::string类型异常的东西所有其他模块都是使用-feexceptions编译的 正如所料 或者某个中间函数的抛出规范没有列出std::string 例如,此程序:
#include <string>
#include <iostream>
using namespace std;
int Hunc() throw(int); // can only throw int (?)
int main()
{
try {
Hunc();
}
catch (string& s) {
std::cout << "caught it: \"" << s << "\"" << endl;
}
return 0;
}
int Hunc() throw(int)
{
throw string("the string exception");
}
还显示在抛出“std::string”实例后调用的terminate。这两个例子都是在一个带有mingw4.5.1的Windows机器上测试的。我会尝试捕获一个常量字符串&。为什么最后一个程序显示实例是std::string?应该是整数?!
caught it: "the string exception"
#include <string>
#include <iostream>
using namespace std;
int Hunc() throw(int); // can only throw int (?)
int main()
{
try {
Hunc();
}
catch (string& s) {
std::cout << "caught it: \"" << s << "\"" << endl;
}
return 0;
}
int Hunc() throw(int)
{
throw string("the string exception");
}