Khối finally
Thuộc phần Logic và luồng chương trình trong hành trình PHP của Coddy. Bài học 54 trên 68.
Đôi khi, bạn cần đoạn code vẫn chạy bất kể có xảy ra ngoại lệ hay không. Khối lệnh finally đảm bảo điều này: nó chứa code luôn chạy sau khi khối lệnh try...catch hoàn tất, rất phù hợp cho các thao tác dọn dẹp như đóng tệp hoặc kết nối cơ sở dữ liệu.
Khối finally chạy trong mọi trường hợp: khi khối try chạy thành công mà không có ngoại lệ, khi ngoại lệ được ném ra và bắt lại, và ngay cả khi ngoại lệ được ném ra nhưng không được bắt lại. Nhờ tính đáng tin cậy này, khối đó rất hữu ích để đảm bảo mã dọn dẹp quan trọng luôn chạy.
<?php
try {
echo "Attempting operation...\n";
// Đoạn code có thể gây ra ngoại lệ (exception)
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup completed.\n";
}
?>Khối finally chạy sau khi cả khối try và catch kết thúc, tạo một vị trí nhất quán để đặt code dọn dẹp thiết yếu. Nhờ đó, script xử lý tài nguyên đúng cách và duy trì trạng thái sạch, bất kể điều gì xảy ra trong quá trình chạy.
Thử thách
DễBạn sẽ nhận hai đầu vào: một loại phép toán và một số. Đầu vào thứ nhất là một chuỗi, có thể là "divide" hoặc "multiply". Đầu vào thứ hai là một số sẽ được dùng trong phép toán.
Đọc cả hai đầu vào và tạo một khối lệnh try...catch...finally. Bên trong khối lệnh try, hãy kiểm tra loại phép toán:
- Nếu phép toán là
"divide", hãy kiểm tra xem số đó có bằng không không. Nếu bằng không, hãy ném mộtExceptionmới với thông báo"Cannot divide by zero". Nếu số đó khác không, hãy tính 100 chia cho số đó và in ra"Result: "theo sau là kết quả. - Nếu phép toán là
"multiply", hãy tính 100 nhân với số đó và in ra"Result: "theo sau là kết quả.
Trong khối lệnh catch, hãy xử lý mọi ngoại lệ bằng cách in ra "Error: " theo sau là thông báo ngoại lệ bằng phương thức getMessage().
Trong khối lệnh finally, hãy in ra "Operation completed".
Định dạng đầu vào:
- Dòng thứ nhất: Một chuỗi cho biết loại phép toán (là
dividehoặcmultiply) - Dòng thứ hai: Một số (ví dụ:
5,0hoặc2.5)
Đầu ra mong đợi:
- Nếu phép toán thành công:
Result:theo sau là giá trị đã tính, rồi đếnOperation completedtrên một dòng mới - Nếu xảy ra phép chia cho không:
Error: Cannot divide by zero, rồi đếnOperation completedtrên một dòng mới
Tự làm thử
<?php
// Đọc các đầu vào
$operation = trim(fgets(STDIN));
$number = floatval(fgets(STDIN));
// TODO: Viết code bên dưới
// Tạo khối lệnh try...catch...finally để xử lý phép toán
?>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
1Hàm nâng cao
Hàm ẩn danhClosure và 'use'Hàm mũi tênHàm callbackDùng 'call_user_func'Hàm biếnTruyền tham chiếuHàm đệ quyÔn tập: tổng hợp về hàm4Mảng đa chiều
Tạo mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuChỉnh sửa phần tử trong mảng 2 chiềuLặp qua các vòng lặp lồng nhauMảng kết hợp 2 chiềuÔn tập: bài tập lưới đơn giản2Thao tác nâng cao với mảng
Thêm phần tử bằng 'array_push'Xóa phần tử bằng 'array_pop'Thêm phần tử vào đầu mảng bằng 'array_unshift'Xóa phần tử đầu mảng bằng 'array_shift'Gộp các mảng được đánh chỉ sốGộp các mảng kết hợpTrích xuất phần tử bằng 'array_slice'Kiểm tra giá trị bằng 'in_array'Tìm khóa bằng 'array_search'Ôn tập: bài tập về danh sách phát5Sổ điểm học sinh
Thiết lập dự án: cấu trúc dữ liệuThêm học sinh mớiThêm điểm cho học sinhTính điểm trung bình của học sinhTìm học sinh có điểm cao nhấtTạo bảng điểm8Xử lý lỗi và ngoại lệ
Hiểu về lỗi trong PHPKhối try...catchKhối finallyNém ngoại lệTạo ngoại lệ tùy chỉnhSử dụng ngoại lệ tùy chỉnhÔn tập: Xác thực đầu vào3Sắp xếp mảng
Sắp xếp mảng có chỉ số tăng dầnSắp xếp mảng có chỉ số giảm dầnSắp xếp mảng kết hợp theo giá trịSắp xếp mảng kết hợp theo khóaSắp xếp theo thứ tự tự nhiênSắp xếp tùy chỉnh bằng 'usort'Ôn tập: Sắp xếp bảng xếp hạngTự luyện tập: Trình biên dịch PHP online