ensure và raise
Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 46 trên 56.
Còn hai thành phần nữa là bộ công cụ xử lý lỗi hoàn chỉnh.
ensure là một khối lệnh luôn chạy, bất kể begin kết thúc bình thường, một nhánh rescue bắt được ngoại lệ hay ngoại lệ không được bắt. Đây là nơi bạn đặt code dọn dẹp:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# đang mở tệp
# đã bắt được ngoại lệ
# đang đóng tệpraise là cách bạn tạo ngoại lệ của riêng mình. Truyền vào một chuỗi làm thông báo, hoặc một lớp cùng với thông báo:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... thực hiện rút tiền
endQuy ước là gọi raise sớm, ngay đầu phương thức (method), để báo lỗi ngay khi đối số (argument) không hợp lệ. Bên gọi có thể dùng rescue nếu có cách xử lý phù hợp, hoặc để ngoại lệ tiếp tục lan lên.
Thử thách
DễĐịnh nghĩa phương thức safe_divide(a, b):
- Ném
ArgumentErrorvới thông báo"b cannot be zero"nếub == 0 - Nếu không, trả về
a / b
Sau đó, đọc hai số nguyên từ đầu vào. Gọi safe_divide bên trong begin / rescue / ensure:
- Nếu thành công, in ra
Result: <value> - Nếu gặp
ArgumentError, in raError: <message> - Trong
ensure, luôn in raDone.
Với đầu vào 10 / 2, đầu ra là:
Result: 5
Done.Với đầu vào 10 / 0:
Error: b cannot be zero
Done.Tự làm thử
# TODO: định nghĩa hàm (function) safe_divide(a, b), ném ngoại lệ ArgumentError khi b == 0
a = gets.to_i
b = gets.to_i
# TODO: dùng begin ... in ra Result; rescue ArgumentError => e ... in ra Error; ensure ... in ra Done.
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 xử lý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệuTự luyện tập: Trình biên dịch Ruby online