首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++捕获所有异常

C++捕获所有异常
EN

Stack Overflow用户
提问于 2008-11-25 00:11:11
回答 16查看 433.2K关注 0票数 302

是否有一个与Java等价的c++

代码语言:javascript
复制
try {
    ...
}
catch (Throwable t) {
    ...
}

我正在尝试调试调用本地windows函数的Java/jni代码,但虚拟机总是崩溃。本机代码在单元测试中看起来很好,并且似乎只有在通过jni调用时才会崩溃。一个通用的异常捕获机制将被证明是非常有用的。

EN

回答 16

Stack Overflow用户

发布于 2008-11-25 00:22:53

代码语言:javascript
复制
try{
    // ...
} catch (...) {
    // ...
}

将捕获所有C++异常,但这应该被认为是糟糕的设计。您可以使用c++11的新current_exception机制,但是如果您不能使用c++11(需要重写的遗留代码系统),那么您就没有命名异常指针可用来获取消息或名称。您可能希望为可以捕获的各种异常添加单独的catch子句,并且只捕获底部的所有内容以记录意外的异常。例如:

代码语言:javascript
复制
try{
    // ...
} catch (const std::exception& ex) {
    // ...
} catch (const std::string& ex) {
    // ...
} catch (...) {
    // ...
}
票数 374
EN

Stack Overflow用户

发布于 2008-11-25 01:07:30

有人应该补充说,在C++代码中无法捕获“崩溃”。这些不抛出异常,但可以做任何他们喜欢的事情。当你看到一个程序因为空指针取消引用而崩溃时,它就是在做未定义的行为。没有std::null_pointer_exception。在这一点上,尝试捕获异常是没有帮助的。

只是为了以防万一,有人正在阅读这个帖子,并认为他可以找到程序崩溃的原因。应该使用像gdb这样的调试器。

票数 168
EN

Stack Overflow用户

发布于 2014-06-10 21:19:16

这就是你如何从catch(...)中对异常类型进行逆向工程,如果你需要使用GCC(在从第三方库中捕获未知时可能会很有用):

代码语言:javascript
复制
#include <iostream>

#include <exception>
#include <typeinfo>
#include <stdexcept>

int main()
{
    try {
        throw ...; // throw something
    }
    catch(...)
    {
        std::exception_ptr p = std::current_exception();
        std::clog <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
    }
    return 1;
}

如果你能负担得起使用Boost,你可以使你的捕获部分更简单(在外部),并且有可能是跨平台的

代码语言:javascript
复制
catch (...)
{
    std::clog << boost::current_exception_diagnostic_information() << std::endl;
}
票数 90
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/315948

复制
相关文章

相似问题

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