首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::exception的what()返回"std::exception“

std::exception的what()返回"std::exception“
EN

Stack Overflow用户
提问于 2015-02-17 10:13:46
回答 2查看 10.9K关注 0票数 14

这里的Java人坚持做一些c++。我正在捕获一个异常,并试图诊断它来自哪里(遗憾的是,当通过gdb运行时,该异常没有被抛出)。但是,当我打印出异常的what()时,我只得到字符串"std:: exception“。这是不是特定于标准库中的任何东西,或者很多标准异常都会返回它?下面是我要打印的内容:

代码语言:javascript
复制
    } catch (const std::exception & ex) {
      std::cout << ex.what() << std::endl;
    }

输出结果如下:

代码语言:javascript
复制
std::exception

此外,我在一个相当大的代码库中工作,这可能是来自我们这一端的一些异常,但我还没有通过常规搜索技术找到它,所以我目前倾向于来自标准库。

如果相关的话,我使用的是g++ 4.8。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-17 10:28:26

C++异常与Java异常完全不同。

C++标准指定由what()返回的字符串是完全任意的,并且由实现定义:

代码语言:javascript
复制
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++调试器应该允许您在抛出任何异常时以及在它被捕获之前设置断点,以便您可以在异常发生时通过调试器检查堆栈回溯。

票数 5
EN

Stack Overflow用户

发布于 2016-02-09 23:01:40

这可能是因为两件事:

  1. 某人只是在某个地方执行throw std::exception(),这不是很有帮助。
  2. std::exception派生的一个类被复制到std::exception。这是一个称为Object Slicing.

的问题

实际上,我自己刚刚犯了第二个错误。我有这样的代码:

代码语言:javascript
复制
try
{
    // Some Boost stuff
}
catch (std::exception e)
{
    cerr << e.what() << endl;
}

您必须确保执行std::exception& e。我知道你没有犯这个错误,但有可能是其他人在代码中犯了更多的错误(或者是来自谷歌的人)。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28553609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档