(个人总结,不全面)
1. 【C++】没有finally,只有RAII(资源申请即初始化,即栈分配对象的析构函数)或std::auto_ptr/boost::shared_ptr(即堆分配对象的析构函数),借助析构函数的能力来实现,see http://topic.csdn.net/t/20060610/10/4813049.html
【Java】支持finally,期望程序员在finally中显式地释放系统资源。
结论:Java的异常写法更清晰,而C++的异常较隐晦和自动)。
2. 【C++】强调异常安全性(既要求资源正确释放,还要求在函数被中止抛出时保护类成员变量的不变式)
【Java】同样强调异常安全,但更侧重于资源释放,较少会顾及类的不变式(因为大多数操作是在临时的堆变量上)或者总是会检查类的不变式。(有些Java书把异常安全性称为异常原子性)
结论:Java的异常比C++的写法更随意,不需要重新抛出异常。
3. 【C++】异常不一定要明确catch
【Java】异常不catch可能会导致编译失败
结论:C++认为绝大部分情况下异常不会发生(也不必要)。Java大量使用异常可能是因为内部有众多分散的模块,以及虚拟机自身的不稳定。Java需要一种清晰而且高效的控制方式及时地处理异常,但C++认为只有标准库那样子复杂才有必要。
4. 【C++】没有强制的异常基类,捕获所有异常可以用catch(...)
【Java】用户异常必须继承自Exception,捕获所有异常则是用catch(Throwable x)(包括JVM内部错误Error异常、可以用编译器消除的RuntimeException异常,和用户定义的Exception派生类异常)
结论:C++可以抛出各种类型的变量,Java则严格规定三类异常:Error、RuntimeException和Exception的派生类(Exception也是RuntimeException的基类)。C++的运行期错误处理比Java的写法要宽松。
C++和Java都希望用户自己定义异常类以使异常处理更高效和准确。
(待补充)