Exception

ภาษาส่วนใหญ่ มักจัดการกับปัญหาที่คาดไม่ถึง ด้วย exception เมื่อโปรแกรมมีปัญหาแทนที่จะออกจากโปรแกรมไปเลย ถ้านักพัฒนาเขียน exception ไว้โปรแกรมจะก็จะมาเรียก exception แทนที่จะออกจากโปรแกรมไป

ruby ไม่มี exception :p

เราจะใช้ begin/rescue ในการ catch exceptions แทน

begin
  quotient = 1/0  #Boom!
rescue
  puts('Something bad happen')
end

ในกรณีข้างต้น แทนที่โปรแกรมจะแสดง error

ZeroDivisionError: divided by 0
    from (irb):1:in `/'
    from (irb):1

โปรแกรมจะแสดงคำว่า “Something bad happen”

ถ้าเราต้องการแสดงผลให้ตรงกับปัญหาที่เกิดขึ้นเราสามารถ กำหนดได้ว่าปัญหาแบบไหนที่ให้ rescue

begin
  quotient = 1/0  #Boom!
rescue ZeroDivisionError
  puts('You tried to divide by zero')
end

ในตัวอย่างข้างต้นถ้าปัญหาที่เกิดไม่ได้เป็นการหารด้วยศูนย์ โปรแกรมจะแสดง error ตามปกติโดยไม่เข้า rescue

ถ้าเรารู้อยู่แล้วว่า method ของเรามีโอกาศ error แทนที่จะรอให้เกิด error ก่อน เราสามารถตรวจสอบแล้วส่งไป rescue ได้เลย

if denominator == 0
  raise ZeroDivisionError
end
return numerator/denominator

ในกรณีที่เราต้องการสร้าง exception ของตนเอง ruby มีทางลัดให้

>>> raise 'You did it wrong'
RuntimeError: You did it wrong

ruby จะสร้าง Object RuntimeException ขึ้นมาแล้วใช้ ‘You did it wrong’ เป็นข้อความแนบไปกับ exception ที่เกิดขึ้น ในกรณีนี้เราไม่ต้องใช้ rescue เลย