c++中有类似Java的吗
try {
...
}
catch (Throwable t) {
...
}
我试图调试Java/jni代码调用本机windows函数和虚拟机不断崩溃。本机代码在单元测试中表现良好,只有在通过jni调用时才会崩溃。一个通用的异常捕获机制将被证明是非常有用的。
c++中有类似Java的吗
try {
...
}
catch (Throwable t) {
...
}
我试图调试Java/jni代码调用本机windows函数和虚拟机不断崩溃。本机代码在单元测试中表现良好,只有在通过jni调用时才会崩溃。一个通用的异常捕获机制将被证明是非常有用的。
当前回答
你可以使用
catch(...)
但这是非常危险的。在约翰·罗宾斯的《调试Windows》一书中,他讲述了一个战争故事,一个非常严重的bug被一个catch(…)命令掩盖了。您最好捕获特定的异常。捕获您认为try块可能合理抛出的任何异常,但如果确实发生意外,则让代码抛出更高的异常。
其他回答
嗯,如果你想捕获所有异常来创建一个小转储,例如…
有人做了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)中创建一个迷你转储。
try {
// ...
} catch (...) {
// ...
}
注意…catch里面是一个真正的省略号。三个点。
然而,由于c++异常不一定是基Exception类的子类,因此在使用此构造时无法实际看到抛出的异常变量。
你可以使用
catch(...)
但这是非常危险的。在约翰·罗宾斯的《调试Windows》一书中,他讲述了一个战争故事,一个非常严重的bug被一个catch(…)命令掩盖了。您最好捕获特定的异常。捕获您认为try块可能合理抛出的任何异常,但如果确实发生意外,则让代码抛出更高的异常。
简单来说,使用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(…)的正确方法。
如果你正在寻找特定于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++异常,还可以捕获访问违规或其他系统异常。