Ruby จัดการข้อผิดพลาดด้วย begin/rescue/ (เทียบเท่า try/catch/finally ของ Ruby) คุณ ข้อยกเว้นและ มัน โดยมี สำหรับการ cleanup Ruby ยังอนุญาตให้ rescue ในระดับเมธอด (โดยไม่ต้องมี อย่างชัดเจน) เพื่อโค้ดที่สะอาดกว่า
Ruby จัดการข้อผิดพลาดด้วย begin/rescue/ (เทียบเท่า try/catch/finally ของ Ruby) คุณ ข้อยกเว้นและ มัน โดยมี สำหรับการ cleanup Ruby ยังอนุญาตให้ rescue ในระดับเมธอด (โดยไม่ต้องมี อย่างชัดเจน) เพื่อโค้ดที่สะอาดกว่า
ensureraiserescueensurebeginbegin
result = risky_operation
rescue ArgumentError => e # rescue a SPECIFIC exception type
puts "Bad argument: #{e.message}"
rescue StandardError => e # broader catch (StandardError, not Exception)
puts "Error: #{e.message}"
retry if attempts < 3 # retry can re-run the begin block
else
puts "succeeded" # runs if NO exception
ensure
cleanup # ALWAYS runs (success or failure)
end
begin/rescue/ensure คือ try/catch/finally ของ Ruby rescue ชนิดที่เฉพาะเจาะจง (rescue ArgumentError), ใช้ ensure สำหรับการ cleanup ที่รับประกัน และ else สำหรับกรณีที่ไม่มี error retry สามารถลองทำบล็อกใหม่ได้
rescue => e # ✅ bare rescue catches StandardError (the right default)
rescue StandardError # ✅ explicit, same thing
rescue Exception # ❌ AVOID — catches EVERYTHING including system signals
# (Interrupt/Ctrl-C, SystemExit) — can break the program
สำคัญ: bare rescue จับ StandardError (ค่าเริ่มต้นที่ถูกต้องสำหรับ error ของแอปพลิเคชัน) การ rescue Exception (ราก) จับทุกอย่าง รวมถึงสัญญาณระดับระบบอย่าง Interrupt (Ctrl-C) และ SystemExit ซึ่งโดยปกติคุณไม่ต้องการจับ เพราะมันสามารถป้องกันไม่ให้โปรแกรมถูกขัดจังหวะหรือออกได้อย่างถูกต้อง นี่เป็นข้อผิดพลาดที่พบบ่อยใน Ruby
raise ArgumentError, "Amount must be positive" # raise a built-in
raise "Something failed" # raises RuntimeError
# custom exception class
class InsufficientFundsError < StandardError # inherit from StandardError
def initialize(msg = "Not enough funds")
super
end
end
raise InsufficientFundsError
def process
do_work
rescue => e # rescue WITHOUT begin — applies to the whole method body
handle(e)
ensure
cleanup
end
การจัดการข้อยกเว้นที่เหมาะสมเป็นสิ่งจำเป็นสำหรับแอปพลิเคชัน Ruby ที่ทนทาน และการเข้าใจแนวทางของ Ruby รวมถึงสำนวนและข้อควรระวังเฉพาะของมัน เป็นสิ่งสำคัญ
โครงสร้าง begin/rescue/ensure (try/catch/finally ของ Ruby) การ rescue ชนิดข้อยกเว้นที่เฉพาะเจาะจง การใช้ ensure สำหรับการ cleanup ที่รับประกัน และ การ rescue ในระดับเมธอด ที่สะอาด (โดยไม่ต้องมี begin อย่างชัดเจน) เป็นความรู้พื้นฐานในชีวิตประจำวัน
จุดที่สำคัญเป็นพิเศษและเป็นเอกลักษณ์ของ Ruby คือ ความแตกต่างระหว่าง StandardError กับ Exception: bare rescue (และค่าเริ่มต้นที่ถูกต้อง) จับ StandardError แต่การ rescue Exception (รากของลำดับชั้น) จับทุกอย่าง รวมถึงสัญญาณระบบอย่าง Interrupt (Ctrl-C) และ SystemExit ซึ่งคุณแทบไม่เคยต้องการ เพราะมันสามารถป้องกันไม่ให้โปรแกรมถูกขัดจังหวะหรือออกได้อย่างถูกต้อง และเป็นข้อผิดพลาดที่พบบ่อยและเป็นอันตราย
การเข้าใจว่าคุณควร rescue StandardError (ไม่ใช่ Exception) สำหรับ error ของแอปพลิเคชัน เป็นความรู้เฉพาะของ Ruby ที่สำคัญซึ่งป้องกันบั๊กจริง
การรู้โครงสร้าง คลาสข้อยกเว้นแบบกำหนดเอง (สืบทอดจาก StandardError), retry, สำนวนการ rescue ในระดับเมธอด และโดยเฉพาะข้อควรระวัง StandardError-ไม่ใช่-Exception เป็นสิ่งสำคัญต่อการเขียน Ruby ที่ทนทานและถูกต้อง ซึ่งจัดการ error ได้อย่างนุ่มนวลโดยไม่ทำลายความสามารถของโปรแกรมในการถูกขัดจังหวะ
เนื่องจาก error ที่ไม่ได้จัดการและข้อผิดพลาดในการ rescue Exception ต่างก็ก่อให้เกิดปัญหาจริง การเชี่ยวชาญการจัดการข้อยกเว้นของ Ruby ทั้งโครงสร้าง สำนวน และความแตกต่างที่สำคัญระหว่าง StandardError กับ Exception จึงเป็นความรู้สำคัญที่เกี่ยวข้องบ่อยสำหรับการพัฒนา Ruby ที่เชื่อถือได้ และเป็นหัวข้อสัมภาษณ์ที่พบบ่อย