Nhiều mệnh đề rescue
Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 45 trên 56.
Một khối begin có thể có nhiều mệnh đề rescue. Ruby kiểm tra chúng từ trên xuống dưới và chạy mệnh đề đầu tiên có lớp ngoại lệ khớp.
begin
number = Integer(gets.chomp)
result = 100 / number
puts result
rescue ArgumentError
puts "That's not a valid number."
rescue ZeroDivisionError
puts "Can't divide by zero."
endThứ tự rất quan trọng: hãy liệt kê các lớp cụ thể trước các lớp tổng quát. Nếu đặt StandardError ở đầu tiên, nó sẽ bắt hết mọi thứ và các nhánh phía sau sẽ không bao giờ chạy.
Bạn cũng có thể bắt nhiều lớp ngoại lệ trong cùng một nhánh bằng cách liệt kê chúng, ngăn cách bằng dấu phẩy:
begin
risky_call
rescue ArgumentError, TypeError => e
puts "Bad input: #{e.message}"
endDùng cách này khi mã khôi phục giống nhau cho nhiều chế độ lỗi.
Thử thách
DễĐọc hai dòng đầu vào, cả hai đều được cho là số nguyên. Dùng Integer(...) cho cả hai, rồi chia số thứ nhất cho số thứ hai.
Xử lý ba trường hợp bằng các nhánh rescue riêng:
ArgumentError→ in raBad number!ZeroDivisionError→ in raCannot divide by zero!TypeError→ in raWrong type!
Nếu mọi thứ đều thành công, in ra Result: <a / b> (phép chia số nguyên).
Với đầu vào 10 / 2, đầu ra là Result: 5. Với 10 / 0, đầu ra là Cannot divide by zero!. Với 10 / abc, đầu ra là Bad number!.
Tự làm thử
raw_a = gets.chomp
raw_b = gets.chomp
# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
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