ข้อยกเว้น เป็นโครงสร้างข้อมูลพิเศษที่เก็บข้อมูลเกี่ยวกับพิเศษ สภาพที่เกิดขึ้นในใบสมัครของคุณ ข้อยกเว้นคือสัญญาณที่ส่งเมื่อโปรแกรมของคุณไม่สามารถทำงานต่อได้ เนื่องจากไม่ทราบวิธีจัดการกับสถานการณ์เฉพาะ ใน Ruby เราเรียกการส่งสัญญาณว่า เพิ่ม เป็นข้อยกเว้น
raise 'this is an exception'
puts "This message won't be printed."
วิธีที่เร็วที่สุดที่จะเห็นข้อยกเว้นในการดำเนินการคือการเลี้ยงดูตัวเอง โดยใช้ raise
วิธีที่มีข้อความ Ruby จะสร้าง RuntimeError
โดยมีข้อความที่ส่งผ่านเป็นคำอธิบาย นอกจากนี้ยังจะเพิ่มการติดตามสแต็กที่ชี้ไปยังตำแหน่งที่มีข้อยกเว้นในโค้ดของคุณ
$ ruby raise.rb
raise.rb:1:in `<main>': this is an exception (RuntimeError)
เมื่อเรียกใช้สคริปต์ตัวอย่างด้านบน คุณจะสังเกตเห็นว่าตามที่สัญญาไว้ ข้อความจะไม่ถูกพิมพ์หลังจากยกข้อยกเว้นขึ้น นั่นเป็นเพราะข้อยกเว้นที่ไม่สามารถจัดการได้จะหยุดการทำงานของโปรแกรมของคุณโดยทำให้เกิดความผิดพลาด ทั้งนี้เพื่อให้แน่ใจว่าแอปพลิเคชันของคุณจะไม่ทำงานต่อไปหลังจากล้มเหลวในการทำงานอย่างใดอย่างหนึ่งให้เสร็จสิ้น
ข้อยกเว้นประเภทต่างๆ
ภายใน Ruby ยกข้อยกเว้นเมื่อมีสิ่งผิดปกติ ตัวอย่างเช่น คุณจะได้รับข้อยกเว้นเมื่อพยายามหารตัวเลขด้วยศูนย์
irb(main):001:0> 42/0
ZeroDivisionError: divided by 0
from (irb):1:in `/'
from (irb):1
from /Users/jeff/.asdf/installs/ruby/2.3.0/bin/irb:11:in `<main>'
ในกรณีนี้ ประเภทของข้อยกเว้นคือ ZeroDivisionError
แทนที่จะเป็น RuntimeError
เราเห็นมาก่อน มีข้อยกเว้นหลายสิบประเภทเพื่อสร้างลำดับชั้นข้อยกเว้นของ Ruby และทั้งหมดถูกหยิบยกขึ้นในสถานการณ์ที่แตกต่างกัน
RuntimeError
เป็นคลาสข้อยกเว้นทั่วไป แต่มีตัวอย่างเฉพาะเจาะจงมากขึ้น NoMethodError
ถูกยกขึ้นเมื่อพยายามเรียกเมธอดที่ไม่มีอยู่ และ ArgumentError
สังเกตว่าอาร์กิวเมนต์ที่ไม่ถูกต้องถูกส่งไปยังวิธีการที่มีอยู่เป็นต้น
ข้อยกเว้นการช่วยเหลือ
แอปพลิเคชันส่วนใหญ่ต้องการความสามารถในการกู้คืนจากข้อยกเว้น ในเว็บแอปพลิเคชัน ข้อผิดพลาดอาจเกิดขึ้นได้เมื่อผู้ใช้ส่งข้อมูลผิดพลาดในแบบฟอร์ม ซึ่งจะส่งผลให้มีการแสดงข้อความแสดงข้อผิดพลาดต่อผู้ใช้แทนที่จะทำให้เว็บเซิร์ฟเวอร์ทั้งหมดขัดข้อง
ในกรณีเช่นนี้ อาจมีข้อยกเว้นเกิดขึ้น แต่เว็บเซิร์ฟเวอร์จะได้รับการช่วยเหลือก่อนที่จะไปถึงด้านบนสุดของ call stack ซึ่งป้องกันข้อยกเว้นไม่ให้แอปพลิเคชันขัดข้อง
begin
raise 'this is an exception'
rescue RuntimeError => exception
puts "Exception rescued: #{exception.inspect}"
# => "Exception rescued: #<RuntimeError: this is an exception>"
end
puts "This message *will* be printed."
การรวมตัวอย่างก่อนหน้านี้ในบล็อกเริ่มต้น/กู้ภัย ข้อยกเว้นจะไม่ถูกยกขึ้น และจะไม่ทำให้แอปของเราขัดข้อง แต่จะมีการดำเนินการ Rescue-block ซึ่งจะพิมพ์ข้อความอธิบายว่าข้อยกเว้นถูกขัดขวาง ในกรณีนี้ นอกจากนี้ เนื่องจากเป็นการป้องกันแอปของเราจากการหยุดทำงาน ข้อความสุดท้าย จะ รับพิมพ์
ตัวอย่างนี้กู้คืนจาก RuntimeError
. โดยเฉพาะ s ดังนั้นข้อผิดพลาดอื่น ๆ จะไม่ถูกจับ ความเฉพาะเจาะจงเกี่ยวกับข้อผิดพลาดที่ได้รับการช่วยเหลือนั้นสะดวก เพราะจะช่วยให้คุณทำสิ่งต่าง ๆ ได้เมื่อเกิดข้อผิดพลาดต่างกัน นอกจากนี้ สิ่งสำคัญคือต้องไม่ช่วยเหลือข้อยกเว้นมากเกินไป
สำหรับไพรเมอร์ในเชิงลึกเกี่ยวกับการจัดการข้อยกเว้น และเคล็ดลับบางประการเกี่ยวกับวิธีการช่วยเหลือข้อยกเว้นอย่างเหมาะสม โปรดดูไพรเมอร์ข้อยกเว้นของเราใน Ruby Magic
มีคำถามเกี่ยวกับการเพิ่มหรือจับข้อยกเว้นใน Ruby หรือไม่? โปรดอย่าลังเลที่จะแจ้งให้เราทราบที่ @AppSignal แน่นอน เราอยากทราบว่าคุณชอบบทความนี้อย่างไร หรือหากคุณมีหัวข้ออื่นที่ต้องการทราบข้อมูลเพิ่มเติม