Ruby xử lý lỗi với begin/rescue/ (tương đương try/catch/finally của Ruby). Bạn exception và chúng, với cho việc dọn dẹp. Ruby cũng cho phép rescue cấp method (không cần tường minh) để code sạch hơn.
Ruby xử lý lỗi với begin/rescue/ (tương đương try/catch/finally của Ruby). Bạn exception và chúng, với cho việc dọn dẹp. Ruby cũng cho phép rescue cấp method (không cần tường minh) để code sạch hơn.
ensureraiserescueensurebeginbegin
result = risky_operation
rescue ArgumentError => e # rescue một kiểu exception CỤ THỂ
puts "Bad argument: #{e.message}"
rescue StandardError => e # bắt rộng hơn (StandardError, không phải Exception)
puts "Error: #{e.message}"
retry if attempts < 3 # retry có thể chạy lại khối begin
else
puts "succeeded" # chạy nếu KHÔNG có exception
ensure
cleanup # LUÔN chạy (thành công hay thất bại)
end
begin/rescue/ensure là try/catch/finally của Ruby. Rescue các kiểu cụ thể (rescue ArgumentError), dùng ensure để dọn dẹp được đảm bảo, và else cho trường hợp không lỗi. retry có thể thử lại khối.
rescue => e # ✅ rescue trống bắt StandardError (mặc định đúng)
rescue StandardError # ✅ tường minh, cùng một thứ
rescue Exception # ❌ TRÁNH — bắt MỌI THỨ kể cả tín hiệu hệ thống
# (Interrupt/Ctrl-C, SystemExit) — có thể làm hỏng chương trình
Quan trọng: một rescue trống bắt StandardError (mặc định đúng cho lỗi ứng dụng). Rescue Exception (gốc) bắt mọi thứ, kể cả các tín hiệu cấp hệ thống như Interrupt (Ctrl-C) và SystemExit — điều mà bạn thường không muốn bắt, vì nó có thể ngăn chương trình bị gián đoạn hoặc thoát đúng cách. Một sai lầm Ruby thường gặp.
raise ArgumentError, "Amount must be positive" # raise một exception có sẵn
raise "Something failed" # raise RuntimeError
# class exception tùy chỉnh
class InsufficientFundsError < StandardError # kế thừa từ StandardError
def initialize(msg = "Not enough funds")
super
end
end
raise InsufficientFundsError
def process
do_work
rescue => e # rescue KHÔNG cần begin — áp dụng cho toàn thân method
handle(e)
ensure
cleanup
end
Xử lý exception đúng cách là thiết yếu cho các ứng dụng Ruby vững chắc, và hiểu cách tiếp cận của Ruby — bao gồm các idiom và lưu ý cụ thể — là quan trọng.
Cấu trúc begin/rescue/ensure (try/catch/finally của Ruby), rescue các kiểu exception cụ thể, dùng ensure cho dọn dẹp được đảm bảo, và rescue cấp method sạch sẽ (không cần begin tường minh) là kiến thức nền tảng dùng hằng ngày.
Một điểm đặc biệt quan trọng và đặc thù Ruby là phân biệt StandardError với Exception: một rescue trống (và mặc định đúng) bắt StandardError, nhưng rescue Exception (gốc của phân cấp) bắt mọi thứ — kể cả các tín hiệu hệ thống như Interrupt (Ctrl-C) và SystemExit — điều bạn gần như không bao giờ muốn, vì nó có thể ngăn chương trình bị gián đoạn hoặc thoát đúng cách, và là sai lầm thường gặp, có hại.
Hiểu rằng bạn nên rescue StandardError (không phải Exception) cho lỗi ứng dụng là kiến thức đặc thù Ruby quan trọng giúp ngăn lỗi thực sự.
Biết cấu trúc, class exception tùy chỉnh (kế thừa từ StandardError), retry, idiom rescue cấp method, và đặc biệt là lưu ý StandardError-không-phải-Exception là quan trọng để viết Ruby vững chắc, đúng đắn xử lý lỗi một cách nhẹ nhàng mà không phá hỏng khả năng bị gián đoạn của chương trình.
Vì các lỗi không được xử lý và sai lầm rescue-Exception đều gây vấn đề thực sự, thành thạo xử lý exception của Ruby — cấu trúc, idiom, và phân biệt StandardError với Exception then chốt của nó — là kiến thức quan trọng, thường liên quan cho việc phát triển Ruby đáng tin cậy và là chủ đề phỏng vấn thường gặp.