c++中有类似Java的吗

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

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


当前回答

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

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

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

其他回答

嗯,如果你想捕获所有异常来创建一个小转储,例如…

有人做了Windows的工作。

参见http://www.codeproject.com/Articles/207464/Exception-Handling-in-Visual-Cplusplus 在这篇文章中,他解释了他如何发现如何捕获各种异常,并提供了有效的代码。

以下是你可以找到的清单:

 SEH exception
 terminate
 unexpected
 pure virtual method call
 invalid parameter
 new operator fault 
 SIGABR
 SIGFPE
 SIGILL
 SIGINT
 SIGSEGV
 SIGTERM
 Raised exception
C++ typed exception

以及用法: CCrashHandler ch; ch.SetProcessExceptionHandlers ();//为一个线程执行此操作 ch.SetThreadExceptionHandlers ();//每个thred

默认情况下,这会在当前目录(crashdump.dmp)中创建一个迷你转储。

让我在这里提一下:Java

try 
{
...
}
catch (Exception e)
{
...
}

可能无法捕获所有异常!其实我以前也遇到过这种事,很让人抓狂;Exception派生自Throwable。因此,从字面上看,要捕获所有东西,你不希望捕获异常;你想抓住Throwable。

我知道这听起来很挑剔,但是当你花了好几天时间试图弄清楚“未捕获的异常”来自于被try包围的代码时……catch (Exception e)" block来自哪里,它会一直跟着你。

对于无法正确调试使用JNI的程序的真正问题(或者在调试器下运行时不出现错误):

在这种情况下,在JNI调用(即所有本机方法都是私有的,类中的公共方法调用它们)周围添加Java包装器通常会有所帮助,这些包装器会做一些基本的完整性检查(检查所有“对象”都被释放,释放后“对象”没有被使用)或同步(将所有方法从一个DLL同步到单个对象实例)。让java包装器方法记录错误并抛出异常。

这通常有助于发现真正的错误(令人惊讶的是,这些错误主要出现在Java代码中,不遵守被调用函数的语义,导致一些讨厌的double-free或类似的情况),比尝试在本地调试器中调试大型并行Java程序更容易……

如果您知道原因,请将代码保存在可以避免该原因的包装器方法中。最好让你的包装器方法抛出异常,而不是你的JNI代码崩溃VM…

可以这样写:

try
{
  //.......
}
catch(...) // <<- catch all
{
  //.......
}

但是这里有一个非常不明显的风险:您无法找到try块中抛出的错误的确切类型,因此当您确定无论异常类型是什么,程序都必须以catch块中定义的方式持续存在时,可以使用这种catch。

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

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

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