这里的Java人坚持做一些c++。我正在捕获一个异常,并试图诊断它来自哪里(遗憾的是,当通过gdb运行时,该异常没有被抛出)。但是,当我打印出异常的what()时,我只得到字符串"std:: exception“。这是不是特定于标准库中的任何东西,或者很多标准异常都会返回它?下面是我要打印的内容:
} catch (const std::exception & ex) {
std::cout << ex.what() << std::endl;
}输出结果如下:
std::exception此外,我在一个相当大的代码库中工作,这可能是来自我们这一端的一些异常,但我还没有通过常规搜索技术找到它,所以我目前倾向于来自标准库。
如果相关的话,我使用的是g++ 4.8。
发布于 2015-02-17 10:28:26
C++异常与Java异常完全不同。
C++标准指定由what()返回的字符串是完全任意的,并且由实现定义:
virtual const char* what() const noexcept;
Returns: An implementation-defined ntbs.
Remarks: The message may be a null-terminated multibyte string
(17.5.2.1.4.2), suitable for conversion
and display as a wstring (21.3, 22.4.1.4). The return value remains
valid until the exception object
from which it is obtained is destroyed or a non-const member
function of the exception object is called.您得到的返回值"std::exception“完全符合C++标准。
不要像Java那样依赖C++异常在捕捉到它们之后告诉您它们是从哪里抛出的。这超出了C++标准的范围。在C++中,异常实际上只不过是一种传输执行控制流的机制。
话虽如此:许多C++实现将为您提供一些特定于实现的机制,以最大限度地利用运行库的能力来转储当前堆栈回溯。有关更多信息,请查看C++编译器的文档。
例如,gcc提供了backtrace(),以及一些用于将backtrace()返回的原始地址转换为符号的gcc内部函数,以及用于对符号进行去角化的其他函数。使用这一点,可以炮制出一个与Java的异常处理大致类似的东西;尽管gcc的实现并不完美,并且有一些功能漏洞,而且这也需要提前计划,以及自定义异常类,这些类的构造函数捕获当前的堆栈框架(在异常实际抛出之前);并且,一旦捕获,就可以检查抛出的异常类实例,以获取捕获的回溯信息。
但这对你目前的情况没有真正的帮助。我建议您按照我的建议查看C++编译器的文档,并调查调试器的功能。C++调试器应该允许您在抛出任何异常时以及在它被捕获之前设置断点,以便您可以在异常发生时通过调试器检查堆栈回溯。
发布于 2016-02-09 23:01:40
这可能是因为两件事:
throw std::exception(),这不是很有帮助。std::exception派生的一个类被复制到std::exception。这是一个称为Object Slicing.的问题
实际上,我自己刚刚犯了第二个错误。我有这样的代码:
try
{
// Some Boost stuff
}
catch (std::exception e)
{
cerr << e.what() << endl;
}您必须确保执行std::exception& e。我知道你没有犯这个错误,但有可能是其他人在代码中犯了更多的错误(或者是来自谷歌的人)。
https://stackoverflow.com/questions/28553609
复制相似问题