Tổng quan
Xử lý ngoại lệ trong C++ là một cơ chế để xử lý các lỗi, sự bất thường hoặc các sự kiện không mong muốn có thể xảy ra trong quá trình thực thi chương trình trong thời gian chạy. Điều này cho phép chương trình tiếp tục chạy hoặc thoát một cách nhẹ nhàng khi gặp lỗi thay vì bị treo đột ngột.
C++ cung cấp một bộ từ khóa và cấu trúc để triển khai xử lý ngoại lệ:
- try: Xác định một khối mã code cần được theo dõi để phát hiện các ngoại lệ.
- catch: Chỉ định loại ngoại lệ sẽ bị bắt và khối mã code sẽ được thực thi khi ngoại lệ đó xảy ra
- throw: Ném một ngoại lệ sẽ bị bắt và xử lý bởi khối bắt thích hợp.
- noException: Chỉ định một hàm không đưa ra ngoại lệ hoặc chấm dứt chương trình nếu một ngoại lệ được đưa ra trong phạm vi của nó.
Ví dụ
Đây là một ví dụ minh họa cách sử dụng cơ bản của xử lý ngoại lệ:
#include <iostream>
int divide(int a, int b) {
if (b == 0) {
throw "Division by zero!";
}
return a / b;
}
int main() {
int num1, num2;
std::cout << "Enter two numbers for division: ";
std::cin >> num1 >> num2;
try {
int result = divide(num1, num2);
std::cout << "The result is: " << result << std::endl;
} catch (const char* msg) {
std::cerr << "Error: " << msg << std::endl;
}
return 0;
}
Trong ví dụ này, chúng ta định nghĩa một hàm divide đưa ra một ngoại lệ nếu b bằng không. Trong hàm main, chúng ta sử dụng khối try để gọi divide và xuất kết quả. Nếu một ngoại lệ được ném ra, nó sẽ bị bắt bên trong khối catch, khối này sẽ xuất ra thông báo lỗi. Bằng cách này, chúng ta có thể xử lý lỗi một cách khéo léo hơn là để chương trình bị lỗi khi cố gắng chia cho 0.
Tiêu chuẩn ngoại lệ
C++ cung cấp một tập hợp tiêu chuẩn các lớp ngoại lệ trong thư viện
- std::Exception: Lớp cơ sở cho tất cả các ngoại lệ tiêu chuẩn.
- std::logic_error: Đại diện cho các lỗi có thể được phát hiện tĩnh bởi chương trình.
- std::runtime_error: Đại diện cho các lỗi xảy ra trong quá trình thực thi chương trình.
Đây là một ví dụ cho thấy cách sử dụng các ngoại lệ tiêu chuẩn:
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero!");
}
return a / b;
}
int main() {
int num1, num2;
std::cout << "Enter two numbers for division: ";
std::cin >> num1 >> num2;
try {
int result = divide(num1, num2);
std::cout << "The result is: " << result << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
Trong ví dụ này, chúng tôi đã sửa đổi hàm divide để ném std::runtime_error thay vì một chuỗi đơn giản. Khối catch hiện bắt các ngoại lệ xuất phát từ std::Exception và sử dụng hàm thành viên what() để hiển thị thông báo lỗi.