c++中有类似Java的吗
try {
...
}
catch (Throwable t) {
...
}
我试图调试Java/jni代码调用本机windows函数和虚拟机不断崩溃。本机代码在单元测试中表现良好,只有在通过jni调用时才会崩溃。一个通用的异常捕获机制将被证明是非常有用的。
c++中有类似Java的吗
try {
...
}
catch (Throwable t) {
...
}
我试图调试Java/jni代码调用本机windows函数和虚拟机不断崩溃。本机代码在单元测试中表现良好,只有在通过jni调用时才会崩溃。一个通用的异常捕获机制将被证明是非常有用的。
当前回答
有人应该补充说,在c++代码中无法捕捉“崩溃”。它们不会抛出异常,而是做任何它们喜欢做的事情。当你看到一个程序因为空指针的解引用而崩溃时,它正在做未定义的行为。没有std::null_pointer_exception。试图捕捉异常在那里没有帮助。
只是为了以防万一,有人正在阅读这篇文章,并认为他可以得到程序崩溃的原因。应该使用像gdb这样的调试器。
其他回答
让我在这里提一下:Java
try
{
...
}
catch (Exception e)
{
...
}
可能无法捕获所有异常!其实我以前也遇到过这种事,很让人抓狂;Exception派生自Throwable。因此,从字面上看,要捕获所有东西,你不希望捕获异常;你想抓住Throwable。
我知道这听起来很挑剔,但是当你花了好几天时间试图弄清楚“未捕获的异常”来自于被try包围的代码时……catch (Exception e)" block来自哪里,它会一直跟着你。
可以这样写:
try
{
//.......
}
catch(...) // <<- catch all
{
//.......
}
但是这里有一个非常不明显的风险:您无法找到try块中抛出的错误的确切类型,因此当您确定无论异常类型是什么,程序都必须以catch块中定义的方式持续存在时,可以使用这种catch。
有人应该补充说,在c++代码中无法捕捉“崩溃”。它们不会抛出异常,而是做任何它们喜欢做的事情。当你看到一个程序因为空指针的解引用而崩溃时,它正在做未定义的行为。没有std::null_pointer_exception。试图捕捉异常在那里没有帮助。
只是为了以防万一,有人正在阅读这篇文章,并认为他可以得到程序崩溃的原因。应该使用像gdb这样的调试器。
简单来说,使用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的工作。
参见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)中创建一个迷你转储。