是否有Java的c ++等价物
try { ... } catch (Throwable t) { ... }
我正在尝试调试调用本机Windows函数的Java/jni代码,并且虚拟机不断崩溃.本机代码在单元测试中看起来很好,并且在通过jni调用时似乎只会崩溃.一般的异常捕获机制将证明是非常有用的.
try{ // ... } catch (...) { // ... }
将捕获所有C++异常,但它应被视为糟糕的设计.您可以使用c ++ 11的新current_exception机制,但如果您无法使用c ++ 11(需要重写的遗留代码系统),那么您没有用于获取消息或名称的命名异常指针.您可能希望为可捕获的各种异常添加单独的catch子句,并且只捕获底部的所有内容以记录意外异常.例如:
try{ // ... } catch (const std::exception& ex) { // ... } catch (const std::string& ex) { // ... } catch (...) { // ... }
有人应该补充说,在C++代码中无法捕获"崩溃".那些不会抛出异常,而是做任何他们喜欢的事情.当你看到程序因为空指针解除引用而崩溃时,它正在做未定义的行为.没有std::null_pointer_exception
.试图捕捉异常对那里没有帮助.
只是因为有人正在阅读这个帖子,并认为他可以得到程序崩溃的原因.应该使用像gdb这样的调试器.
这是你可以在catch(...)
需要时从内部对异常类型进行反向工程的方法(在从第三方库中捕获未知时可能很有用):
#include#include #include #include 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
类的子类,因此没有任何方法可以实际查看使用此构造时引发的异常变量.
不可能(在C++中)以可移植的方式捕获所有异常.这是因为某些异常在C++上下文中不是异常.这包括除零错误等等.当这些错误发生时,有可能破解并因此获得抛出异常的能力,但这并不容易,并且当然不容易以可移植的方式获得正确.
如果你想捕获所有STL异常,你可以这样做
try { ... } catch( const std::exception &e) { ... }
这将允许你使用e.what()
,它将返回一个const char*
,它可以告诉你更多关于异常本身.这是一个类似于Java构造的构造,你问的最多.
如果有人愚蠢到抛出不继承的异常,这对你没有帮助std::exception
.
简而言之,使用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(...)
.
可以这样写:
try { //....... } catch(...) // <<- catch all { //....... }
但是这里存在一个非常明显的风险:你找不到try
块中抛出的确切类型的错误,所以catch
当你确定无论什么类型的异常是什么时,使用这种方法,程序必须保持不变以catch
块中定义的方式.
您可以使用
catch(...)
但那非常危险.在他的" 调试Windows"一书中,John Robbins讲述了一个关于一个被catch(...)命令掩盖的非常讨厌的bug的战争故事.捕获特定异常会更好.抓住你认为你的try块可能合理抛出的任何东西,但是如果出现意外的事情,让代码抛出更高的异常.
我在这里只提一下:Java
try { ... } catch (Exception e) { ... }
可能无法捕获所有异常!事实上,我之前已经发生过这样的事情,而且这是令人厌恶的; 异常来自Throwable.从字面上看,要抓住一切,你不要想抓住例外; 你想抓住Throwable.
我知道这听起来很挑剔,但是当你花了几天的时间试图找出"未被捕获的异常"来自代码的地方时,其中包含了一个尝试...捕获(例外e)"块来自,它坚持您.
好吧,如果你想捕获所有异常来创建一个minidump例如......
有人在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
默认情况下,这会在当前目录中创建一个minidump(crashdump.dmp)
通用的异常捕获机制将被证明非常有用。
疑。您已经知道您的代码已损坏,因为它崩溃了。饮食异常可能掩盖了这一点,但这可能只会导致甚至更原始,更微妙的错误。
您真正想要的是调试器...