CPP 异常获取抛出调用方的详细信息
cpp exception get the details of throw caller
>我有一些自定义异常,如下所示
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
} myex;
void testException(){
throw myex;
}
void doSomething2(){
testException();
}
void doSomething1(){
doSomething2();
}
int main () {
try
{
doSomething1();
}
catch (exception& e)
{
cout << e.what() << 'n';
}
return 0;
}
所以在主函数中我无法知道抛出的调用者(哪个函数抛出了异常(,如何获取该详细信息?
据我所知,没有简单的便携式方法可以在C++
中做到这一点。有一些相当复杂的方法可以使用特定于操作系统的调用来获取完整堆栈跟踪。
我用来获取异常源的最简单方法是使用 MACROS。
在可以避免的地方不建议使用宏,但这是它们被证明有用的少数地方之一。
我倾向于使用比这稍微复杂一些的东西,但这是它的基础:
#ifndef NDBUG
#define throw_runtime_error(msg)
throw std::runtime_error(std::string(msg)
+ " line: " + std::to_string(__LINE__)
+ " file: " + std::string(__FILE__))
#else
#define throw_runtime_error(msg) throw std::runtime_error(msg)
#endif
void doSomething2(){
throw_runtime_error("My runtime error.");
}
void doSomething1(){
doSomething2();
}
int main()
{
try
{
doSomething1();
}
catch(std::exception const& e)
{
std::cerr << e.what() << 'n';
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
您不会获得完整的跟踪,但确实可以看到引发异常的位置。仅当未设置NDBUG
时,宏才包含调试信息,因为发布版本应将该宏设置为禁用调试信息。
这应该会有所帮助:
如何在 gcc C++ 程序崩溃时自动生成堆栈跟踪
您可以找到打印调用堆栈的方法,并在异常处理程序中打印它。
相关文章:
- std::extent 实现详细信息说明
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- AVX2收集指令使用详细信息
- 只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
- CppUnit:如何立即打印故障详细信息
- 我可以为 C++ 类提供不完整的标头以隐藏实现详细信息吗?
- CPP 异常获取抛出调用方的详细信息
- 内存映射 IO 概念详细信息
- 如何在文本文件中搜索员工记录(按名称)并仅显示其详细信息?
- 使用TDD时隐藏文件访问实现详细信息
- 急需有关_doserrno(MSVC)的详细信息
- 主 - Embarcadero C++生成器 10.2 中的详细信息数据集
- 如果构造函数从调用到 std::make_shared 崩溃,GDB 是否可以显示崩溃的详细信息
- 实现 std::tuple 的详细信息
- 如何使 clang 格式将所有详细信息命名空间缩进一个
- 如何从 VisualStudio 获取更多详细信息以跟踪警告的来源
- 增加网格详细信息(附加的镶嵌)
- 调用第三方api,如amazon/ebay,使用c++获取产品详细信息