c++中有类似Java的吗

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

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


当前回答

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

有人做了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)中创建一个迷你转储。

其他回答

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

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

c++ 规范说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)中创建一个迷你转储。

如果你正在寻找特定于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++异常,还可以捕获访问违规或其他系统异常。

Can you run your JNI-using Java application from a console window (launch it from a java command line) to see if there is any report of what may have been detected before the JVM was crashed. When running directly as a Java window application, you may be missing messages that would appear if you ran from a console window instead. Secondly, can you stub your JNI DLL implementation to show that methods in your DLL are being entered from JNI, you are returning properly, etc? Just in case the problem is with an incorrect use of one of the JNI-interface methods from the C++ code, have you verified that some simple JNI examples compile and work with your setup? I'm thinking in particular of using the JNI-interface methods for converting parameters to native C++ formats and turning function results into Java types. It is useful to stub those to make sure that the data conversions are working and you are not going haywire in the COM-like calls into the JNI interface. There are other things to check, but it is hard to suggest any without knowing more about what your native Java methods are and what the JNI implementation of them is trying to do. It is not clear that catching an exception from the C++ code level is related to your problem. (You can use the JNI interface to rethrow the exception as a Java one, but it is not clear from what you provide that this is going to help.)

通用的异常捕获机制 会非常有用。

表示怀疑。你已经知道你的代码坏了,因为它崩溃了。进食异常可能会掩盖这一点,但这可能只会导致更糟糕、更微妙的错误。

你真正需要的是一个调试器……