begin / rescue
Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 44 trên 56.
Để ngăn ngoại lệ làm chương trình của bạn bị dừng, hãy đặt đoạn code có thể gây rủi ro bên trong begin ... rescue ... end. Nếu có bất kỳ lệnh nào bên trong begin gây ra ngoại lệ, Ruby sẽ chuyển đến khối rescue tương ứng thay vì dừng chương trình.
begin
result = 10 / 0
puts result
rescue ZeroDivisionError
puts "Cannot divide by zero!"
end
# Không thể chia cho 0!Bạn có thể lấy chính đối tượng ngoại lệ bằng => e và đọc .message của nó:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
end
# Đầu vào không hợp lệ: giá trị không hợp lệ cho Integer(): "hello"Nếu bạn không nêu tên lớp ngoại lệ, riêng rescue sẽ bắt StandardError và các lớp con của nó, tức là hầu hết lỗi thường gặp. Việc bắt lỗi hữu ích nhất khi bạn có thể làm điều gì đó trong khối rescue: thay bằng giá trị mặc định, ghi nhật ký sự cố hoặc hỏi lại người dùng.
Thử thách
DễĐọc hai dòng từ đầu vào, cả hai đều phải là số nguyên, nhưng dòng thứ hai có thể không phải là số hợp lệ.
Bọc thao tác phân tích dòng thứ hai trong begin / rescue:
- Dùng
Integer(input)(lệnh này gây raArgumentErrornếu chuỗi không hợp lệ) - Nếu phân tích thành công, in ra
Sum: <a + b> - Nếu thất bại, in ra
Bad number!
Với đầu vào 3 rồi đến 4, đầu ra là Sum: 7. Với 3 rồi đến abc, đầu ra là Bad number!.
Tự làm thử
a = gets.to_i
raw_b = gets.chomp
# TODO: dùng begin/rescue để bọc Integer(raw_b); in ra tổng hoặc chính xác đoạn văn bản trong hướng dẫ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 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