Tính năng xử lý ngoại lệ hiện diện hầu như mọi ngôn ngữ hướng đối tượng hiện nay. C++ và Java đều có tính năng này. Có một số điểm tương đồng như đều dùng khối try-catch. Tuy nhiên cũng có khác biệt:
Trong C++, có thể ném (throw) bất kỳ kiểu dữ liệu nào làm ngoại lệ. Bất kỳ kiểu nào nghĩa là kiểu nguyên thủy và con trỏ. Trong Java chỉ có thể ném đối tượng throwable. Lớp con của bất kỳ lớp throwable nào cũng có thể ném.
Ví dụ
#include <iostream>
using namespace std;
int main() {
int x = -5;
try { // protected code
if(x < 0) {
throw x;
}
}
catch (int x) {
cout << "Exception Caught: thrown value is " << x << endl;
}
}
Kết quả
Exception Caught: thrown value is -5
Trong C++, có tùy chọn catch-all để bắt bất kỳ loại ngoại lệ nào. Cú pháp:
try {
// protected code
} catch(...) {
// bắt mọi loại ngoại lệ
}
Ví dụ
#include <iostream>
using namespace std;
int main() {
int x = -5;
char y = 'A';
try {
if(x < 0) {
throw x;
}
if(y == 'A') {
throw y;
}
}
catch (...) {
cout << "Exception Caught" << endl;
}
}
Kết quả
Exception Caught
Trong Java, nếu muốn bắt mọi loại ngoại lệ, dùng lớp Exception (lớp cha của mọi ngoại lệ trong Java, hoặc ngoại lệ tự định nghĩa). Cú pháp:
try {
// protected code
} catch(Exception e) {
// bắt mọi loại ngoại lệ
}
C++ không có khối finally. Nhưng Java có khối finally đặc biệt. Code trong finally luôn được thực hiện. Dù try chạy không lỗi hay có ngoại lệ, finally đều chạy.
Cho Java
Ví dụ
public class HelloWorld {
public static void main(String[] args) {
try {
int data = 25/5;
System.out.println(data);
} catch(NullPointerException e) {
System.out.println(e);
} finally {
System.out.println("finally block is always executed");
}
System.out.println("rest of the code...");
}
}
Kết quả
5 finally block is always executed rest of the code...