Từ khóa 'throw'
Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 50 trên 56.
Đôi khi, bạn cần báo hiệu rằng đã xảy ra lỗi trong code của mình, thay vì chỉ bắt các ngoại lệ do hàm khác ném ra. Từ khóa throw cho phép bạn chủ động kích hoạt một ngoại lệ khi chương trình phát hiện vấn đề.
Bạn có thể ném nhiều kiểu giá trị khác nhau làm ngoại lệ, chẳng hạn như số nguyên, chuỗi hoặc thậm chí là đối tượng tùy chỉnh. Đây là cú pháp cơ bản:
if (someErrorCondition) {
throw "Error message"; // Ném một chuỗi ký tự cố định
}Khi bạn dùng throw, chương trình lập tức dừng thực thi hàm hiện tại và tìm khối catch có thể xử lý giá trị được ném ra. Điều này đặc biệt hữu ích khi xác thực đầu vào hoặc kiểm tra những điều kiện không nên xảy ra trong quá trình chương trình chạy bình thường.
Đây là ví dụ thực tế về cách ném ngoại lệ khi phát hiện đầu vào không hợp lệ:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}Bên gọi đặt lời gọi trong một khối try. Chuỗi ký tự được ném có kiểu const char*, vì vậy khối catch ghi kiểu đó và tham số của khối này chứa thông báo:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << std::endl;
}
// Đầu ra: Error: Age cannot be negative!Từ khóa throw giúp bạn kiểm soát thời điểm và cách báo lỗi trong chương trình, nhờ đó các hàm hoạt động ổn định và dễ dự đoán hơn khi gặp điều kiện không hợp lệ.
Thử thách
DễTạo chương trình kiểm tra đầu vào bằng từ khóa throw để chủ động tạo ngoại lệ khi phát hiện điều kiện không hợp lệ. Thử thách này sẽ kiểm tra mức độ hiểu của bạn về cách dùng throw để báo lỗi trong các hàm của riêng mình.
Chương trình sẽ nhận các đầu vào sau:
- Một chuỗi
usernamebiểu thị tên người dùng mà người dùng đã chọn (dòng này có thể để trống) - Một số nguyên
agebiểu thị tuổi của người dùng
Chương trình của bạn cần:
- Tạo hàm có tên
validateUsernhận một chuỗi và một số nguyên làm tham số - Bên trong hàm, kiểm tra xem tên người dùng có để trống không (có độ dài bằng 0)
- Nếu tên người dùng để trống, dùng
throwđể ném chuỗi"Username cannot be empty" - Kiểm tra xem tuổi có nhỏ hơn 13 không
- Nếu tuổi nhỏ hơn 13, dùng
throwđể ném chuỗi"Age must be at least 13" - Nếu cả hai bước kiểm tra đều đạt, in ra
"User validation successful" - Trong hàm chính, gọi
validateUservới các giá trị đầu vào - Dùng khối
tryđể gọi hàm và khốicatchđể xử lý mọi ngoại lệ chuỗi được ném ra
Dùng định dạng đầu ra chính xác sau:
Khi kiểm tra thành công:
User validation successfulKhi có lỗi kiểm tra:
Validation error: [error_message]Hãy nhớ rằng khi dùng throw, chương trình sẽ dừng thực thi hàm hiện tại ngay lập tức và tìm khối catch phù hợp. Khối catch cần chỉ định kiểu const char* để xử lý các chuỗi ký tự được ném ra. Nếu bước kiểm tra đầu tiên không đạt, hàm sẽ ném ngoại lệ và không tiếp tục kiểm tra điều kiện thứ hai.
Tự làm thử
#include <iostream>
#include <string>
using namespace std;
// TODO: Viết hàm (function) validateUser ở đây, phía trên main
// Hàm nhận username kiểu chuỗi và age kiểu số nguyên, rồi ném một chuỗi ký tự khi bước kiểm tra thất bại
int main() {
// Đọc đầu vào
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: Gọi validateUser trong khối try
// và bắt thông báo được ném ra bằng catch (const char* error)
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng8Xử lý lỗi cơ bản
Giới thiệu về ngoại lệKhối lệnh 'try' và 'catch'Từ khóa 'throw'Các kiểu ngoại lệ khác nhauBộ xử lý bắt mọi ngoại lệÔn tập: phép chia an toàn3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online