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中不能工作。
// CPP Program to demonstrate all types (including primitive
// and pointer) can be thrown as exception.
#include <iostream>
using namespace std;
int main()
{
int x = -1;
// some other stuff
try {
// some other stuff
if (x < 0) {
throw x;
}
}
catch (int x) {
cout << "Exception occurred: thrown value is " << x
<< endl;
}
getchar();
return 0;
}
输出:
Exception occurred: thrown value is -1
2)在c++中,有一种特殊的catch,叫做“catch all”,它可以捕获所有类型的异常。
// CPP Program to demonstrate catch all
#include <iostream>
using namespace std;
int main()
{
int x = -1;
char* ptr;
ptr = new char[256];
try {
if (x < 0) {
throw x;
}
if (ptr == NULL) {
throw " ptr is NULL ";
}
}
catch (...) // catch all
{
cout << "Exception occurred: exiting " << endl;
exit(0);
}
getchar();
return 0;
}
输出:
Exception occurred: exiting
在Java中,出于各种实际目的,我们可以捕获Exception对象来捕获各种异常。因为通常我们不会捕获Throwable(s),除了Exception(s)(也就是错误)
catch(Exception e){
…….
}
3)在Java中,有一个名为finally的块 __ 它总是在try-catch块之后执行。这个块可以用来做清理工作。在c++中没有这样的块。
// Java Program to demonstrate creating an exception type
class Test extends Exception {
}
class Main {
public static void main(String args[])
{
try {
throw new Test();
}
catch (Test t) {
System.out.println("Got the Test Exception");
}
finally {
System.out.println("Inside finally block ");
}
}
}
输出:
Got the Test Exception
Inside finally block
4)在c++中,所有异常都是不检查的。在Java中,有两种类型的异常—已检查异常和未检查异常。
5)在Java中,新的关键字 throws 用于列出函数可能引发的异常。在c++中,没有 throws 关键词,同样的关键词 throw 也用于此目的。
6)在c++中,如果异常没有被捕获,那么异常处理子系统将调用unexpected()函数,它将异常地终止程序或应用程序。如果在c++程序中出现任何异常,那么找到这个异常是非常耗时的,因为在c++中,unexpected()没有告诉我们异常发生在哪个类型和哪一行。
但是在Java中,如果没有捕捉到系统生成的异常,那么Java运行时系统(JVM)就会将异常对象移交给默认的异常处理程序,该处理程序基本上会打印出名称、描述以及异常发生在哪一行。因此,在Java中查找和处理异常比在c++语言中更容易。