c++与Java异常处理的比较
两种语言都用于尝试、接住和扔出 __ 异常处理的关键字,它们的含义在两种语言中也是相同的。
以下是Java和c++异常处理的区别:
Java | c++ |
---|---|
只有可抛出的对象可以作为异常抛出。 | 所有类型都可以作为异常抛出。 |
我们可以捕获Exception对象来捕获各种异常。因为通常我们不会捕获Throwable(s),除了Exception(s)。 | 有一种特殊的捕获方法称为“catch all”,它可以捕获所有类型的异常。 |
一个名为finally的特殊块总是在try-catch块之后执行。 | 在c++中没有这样的块。 |
有两种类型的异常—已检查的和未检查的。 | 所有异常都未检查。 |
特殊的关键字throws用于列出函数可能抛出的异常。 | 关键字throw用于列出函数可能抛出的异常。 |
在Java中查找和处理异常更容易。 | 在c++中查找和处理异常是相当困难的。 |
以下将详细讨论上述各点:
1) 在c++中,所有类型(包括原语和指针)都可以作为异常抛出。但是在Java中,只有可抛出对象(throwable对象是throwable类的任何子类的实例)可以作为异常抛出。例如,以下类型的代码在c++中可以工作,但类似的代码在Java中不能工作。
输出:
2)在c++中,有一种特殊的catch,叫做“catch all”,它可以捕获所有类型的异常。
输出:
在Java中,出于各种实际目的,我们可以捕获Exception对象来捕获各种异常。因为通常我们不会捕获Throwable(s),除了Exception(s)(也就是错误)
3)在Java中,有一个名为finally的块 __ 它总是在try-catch块之后执行。这个块可以用来做清理工作。在c++中没有这样的块。
输出:
4)在c++中,所有异常都是不检查的。在Java中,有两种类型的异常—已检查异常和未检查异常。
5)在Java中,新的关键字 throws 用于列出函数可能引发的异常。在c++中,没有 throws 关键词,同样的关键词 throw 也用于此目的。
6)在c++中,如果异常没有被捕获,那么异常处理子系统将调用unexpected()函数,它将异常地终止程序或应用程序。如果在c++程序中出现任何异常,那么找到这个异常是非常耗时的,因为在c++中,unexpected()没有告诉我们异常发生在哪个类型和哪一行。
但是在Java中,如果没有捕捉到系统生成的异常,那么Java运行时系统(JVM)就会将异常对象移交给默认的异常处理程序,该处理程序基本上会打印出名称、描述以及异常发生在哪一行。因此,在Java中查找和处理异常比在c++语言中更容易。