Pac*_*ace 11 c++ stl exception
这里的Java人员坚持做一些c ++.我正在捕获异常并尝试诊断它的来源(遗憾的是,通过gdb运行时不会抛出异常).但是,当我打印出异常的what()时,我只得到字符串"std :: exception".这是否特定于标准库中的任何内容或许多标准异常返回此?以下是我要打印的内容:
} catch (const std::exception & ex) {
std::cout << ex.what() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出只是:
std::exception
Run Code Online (Sandbox Code Playgroud)
此外,我在一个相当大的代码库中工作,这可能是我们最终的一些例外,但我还没有通过常规搜索技术找到它,所以我目前倾向于这个来自标准库.
我正在使用g ++ 4.8,如果这是相关的.
Tim*_*mmm 16
这可能是因为两件事:
有人只是做throw std::exception()某个地方,这不是很有帮助.
派生自的类std::exception被复制到std::exception.这是一个称为对象切片的问题.
我实际上自己犯了第二个错误.我有这个代码:
try
{
// Some Boost stuff
}
catch (std::exception e)
{
cerr << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)
你必须确保这样做std::exception& e.我知道你没有犯这个错误,但是其他人可能会在代码中做更多的事情(或者来自谷歌的人).
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.
Run Code Online (Sandbox Code Playgroud)
您得到的返回值“ std :: exception”完全符合C ++标准。
捕获Java之后,不要像Java一样依靠C ++异常确切地告诉您它们是从哪里抛出的。这超出了C ++标准的范围。在C ++中,异常实际上不过是用于转移执行控制流的机制而已。
话虽这么说:许多C ++实现将为您提供一些特定于实现的机制,以最大程度地利用运行时库的能力来转储当前堆栈的回溯跟踪。检查您的C ++编译器的文档以获取更多信息。
例如,gcc提供了backtrace()以及一些gcc内部函数,这些内部函数将backtrace()返回的原始地址转换为符号,而其他函数则用于分解符号。使用它,可以炮制出Java异常处理的粗略模拟。尽管gcc的实现不是完美的,并且有一些功能上的漏洞,并且还需要预先计划,并且需要定制的异常类,其构造函数捕获当前的堆栈帧(在实际抛出异常之前);一旦捕获,就可以检查抛出的异常类实例以获取捕获的回溯信息。
但这并不能真正帮助您解决当前的情况。我建议您按照我的建议检查C ++编译器的文档,并调查调试器的功能。C ++调试器应允许您在引发任何异常时以及在捕获异常之前设置断点,以便您可以在发生异常时通过调试器检查堆栈回溯。
| 归档时间: |
|
| 查看次数: |
8142 次 |
| 最近记录: |