c++中有类似Java的吗

try {
    ...
}
catch (Throwable t) {
    ...
}

我试图调试Java/jni代码调用本机windows函数和虚拟机不断崩溃。本机代码在单元测试中表现良好,只有在通过jni调用时才会崩溃。一个通用的异常捕获机制将被证明是非常有用的。


当前回答

简单来说,使用catch(…)。但是,请注意catch(…)是与throw结合使用的;基本上:

try{
    foo = new Foo;
    bar = new Bar;
}
catch(...)       // will catch all possible errors thrown. 
{ 
    delete foo;
    delete bar;
    throw;       // throw the same error again to be handled somewhere else
}

这是使用catch(…)的正确方法。

其他回答

这取决于编译器环境。 GCC不捕获这些。 Visual Studio和我之前用的Borland。

因此,关于崩溃的结论是,它取决于开发环境的质量。

c++ 规范说catch(…)必须捕获任何异常,但它不是在所有情况下都捕获。

至少我是这么想的。

这是如何从catch(…)中反向工程异常类型,如果你需要(可能有用时,从第三方库捕获未知)使用GCC:

#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,你可以让你的捕捉部分更简单(在外部),并具有跨平台的潜力

catch (...)
{
    std::clog << boost::current_exception_diagnostic_information() << std::endl;
}
try {
   // ...
} catch (...) {
   // ...
}

注意…catch里面是一个真正的省略号。三个点。

然而,由于c++异常不一定是基Exception类的子类,因此在使用此构造时无法实际看到抛出的异常变量。

如果你正在寻找特定于windows的解决方案,那么有结构化异常处理: https://learn.microsoft.com/en-us/cpp/cpp/try-except-statement

代码如下所示

__try
{
   // code here may throw or make access violation
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
    // after exception code here, e.g. log the error
}

它不仅可以捕获c++异常,还可以捕获访问违规或其他系统异常。

try{
    // ...
} catch (...) {
    // ...
}

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

try{
    // ...
} catch (const std::exception& ex) {
    // ...
} catch (const std::string& ex) {
    // ...
} catch (...) {
    // ...
}