Menu
CoddyTech

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ệp

raise 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
end

Quy ướ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.

challenge icon

Thử thách

Dễ

Định nghĩa phương thức safe_divide(a, b):

  • Ném ArgumentError với thông báo "b cannot be zero" nếu b == 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 ra Error: <message>
  • Trong ensure, luôn in ra Done.

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.
quiz iconTự kiểm tra

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ý

Tự luyện tập: Trình biên dịch Ruby online