ปัญหาที่พบบ่อยใน Ruby คือคุณได้รับข้อความแสดงข้อผิดพลาด ซึ่งในทางเทคนิคแล้วเราเรียกว่า “ข้อยกเว้น”
ข้อยกเว้นเหล่านี้ คาดหวัง เช่น ไฟล์ที่อาจใช้ได้ในบางครั้ง แต่ไม่มีในไฟล์อื่น หรือ API ที่ใช้งานได้ชั่วคราวเนื่องจากข้อจำกัดบางอย่างเท่านั้น หรืออาจไม่คาดคิด .
วันนี้ คุณจะได้เรียนรู้วิธีจัดการข้อผิดพลาดที่คาดหวัง
อย่างไร
ให้ฉันแนะนำคุณเกี่ยวกับ "เริ่มต้น" &"ช่วยเหลือ" ใน Ruby คำหลักสองคำที่สำคัญที่ใช้สำหรับจัดการเงื่อนไขข้อผิดพลาด
ทำงานอย่างไร
ก่อนอื่น คุณต้องเข้าใจบางสิ่งก่อน
โปรแกรม Ruby ของคุณอาจทำให้เกิดข้อผิดพลาดได้หลายจุดในขณะที่กำลังทำงาน
ตัวอย่าง ได้แก่ :
- พยายามอ่านไฟล์ที่ไม่มีอยู่
- การหารตัวเลขด้วยศูนย์
- เว็บเซิร์ฟเวอร์ที่คุณทำงานด้วยมีใบรับรอง SSL ที่ล้าสมัย
เมื่อเกิดข้อผิดพลาด… รูบี้ไม่พังทันที!
คุณได้รับโอกาสในการกู้คืนจากข้อผิดพลาด . เราเรียกสิ่งนี้ว่า “การจัดการข้อยกเว้น”
Ruby ให้คำสำคัญสองสามคำแก่คุณเพื่อใช้การกู้คืนข้อผิดพลาดในโค้ดของคุณ คำหลักเหล่านี้ begin &rescue .
มาค้นพบวิธีใช้งานกัน!
วิธีจัดการกับข้อยกเว้นของ Ruby
คุณจัดการกับข้อยกเว้นเหล่านี้อย่างไร
คุณสามารถห่อโค้ดที่ทำให้เกิดข้อยกเว้นด้วย begin / rescue บล็อก
นี่คือวิธีการ…
ส่วนแรก (begin ) มีรหัสที่คุณจะเรียกใช้ &ที่อาจก่อให้เกิดข้อยกเว้น
ตัวอย่าง :
begin
IO.sysopen('/dev/null')
rescue
# ...
end
เรากำลังพยายามเปิดไฟล์ที่มี sysopen . มีข้อยกเว้นเกิดขึ้นหากเราไม่สามารถเปิดไฟล์ได้
นี่เป็นเวลาที่เหมาะสมที่สุดในการใช้ rescue คีย์เวิร์ด!
การใช้คำหลักนี้คุณสามารถพูดในสิ่งที่คุณต้องการเกิดขึ้นเมื่อมีข้อยกเว้น ดังนั้นโหมดความล้มเหลวจึงอยู่ภายใต้การควบคุมของคุณ
ตัวอย่าง :
begin
IO.sysopen('/dev/null')
rescue
puts "Can't open IO device."
end
คุณต้องการบันทึกข้อผิดพลาดนี้ &อาจระบุค่าเริ่มต้นบางประเภท
อย่า. ไม่สนใจ. เกิดข้อผิดพลาด
การรักษาข้อยกเว้นหลายข้อ
คุณต้องรู้ว่า rescue รับอาร์กิวเมนต์ที่เป็นตัวเลือก
อาร์กิวเมนต์นี้คืออะไร?
อาร์กิวเมนต์นี้คือ คลาสข้อยกเว้น ที่ท่านต้องการช่วยเหลือ
ขึ้นอยู่กับว่าคุณใช้รหัสใด
สำหรับ IO :
- นี่อาจเป็น
Errno::ENOENTสำหรับไฟล์ที่หายไป - หรือ
Errno::EACCESสำหรับข้อผิดพลาดในการอนุญาต
ส่วนที่ดีที่สุด?
คุณสามารถจัดการกับข้อยกเว้นหลายรายการในบล็อกเริ่มต้น/กู้ภัยเดียวกันได้
ถูกใจสิ่งนี้ :
begin
IO.sysopen('/dev/null')
rescue Errno::ENOENT
puts "File not found."
rescue Errno::EACCES
puts "Insufficient permissions, not allowed to open file."
end
หากคุณต้องการให้การกระทำแบบเดียวกันเกิดขึ้นโดยมีข้อยกเว้นหลายข้อ…
คุณทำได้ :
begin
IO.sysopen('/dev/null')
rescue Errno::ENOENT, Errno::EACCES
puts "There was an error opening the file."
end
มาเรียนรู้กันต่อ!
วิธีการช่วยเหลือข้อยกเว้นภายในบล็อกและวิธีการ
คุณไม่จำเป็นต้องใช้ begin . ทุกครั้ง คีย์เวิร์ด
มีบางกรณีที่คุณสามารถทิ้งมันไว้ได้
ที่ไหน
วิธีการและบล็อกภายใน
ตัวอย่าง :
def get_null_device
IO.sysopen('/dev/null')
rescue Errno::ENOENT
puts "Can't open IO device."
end
คำจำกัดความของเมธอดนั้นทำหน้าที่ begin เพื่อให้คุณละเว้นได้
คุณสามารถทำเช่นนี้กับบล็อกได้
ตัวอย่าง :
["a.txt", "b.txt", "c.txt"].map do |f|
IO.sysopen(f)
rescue Errno::ENOENT
puts "Can't open IO device: #{f}."
end
ตอนนี้ มีอีกวิธีหนึ่งในการใช้ rescue คีย์เวิร์ดที่ไม่มี begin .
มาดูกันว่ามันทำงานอย่างไร
ทำความเข้าใจเกี่ยวกับการกู้ภัยแบบอินไลน์และเหตุใดจึงเป็นอันตราย
คุณสามารถใช้ rescue แบบอินไลน์
ในบางกรณีที่พบได้ยาก คุณอาจพบว่าการจัดการข้อยกเว้นรูปแบบนี้มีประโยชน์
นี่คือตัวอย่าง :
["a.txt", "b.txt", "c.txt"].select { |f| File.open(f) rescue nil }.map(&:size)
วิธีนี้ทำให้คุณสามารถเปิดได้เฉพาะไฟล์ที่มีอยู่และละเว้นไฟล์ที่ไม่มี
เป็นผลให้คุณได้รับขนาดสำหรับไฟล์ที่มีอยู่
โดยไม่มีข้อยกเว้น
ทำไมถึงทำเช่นนี้
มันช่วยให้คุณเก็บรหัสของคุณไว้ในบรรทัดเดียวได้
แค่นั้นแหละ.
มี “อันตรายที่ซ่อนอยู่” เมื่อใช้ rescue form รูปแบบนี้ เพราะคุณได้รับข้อยกเว้นทั้งหมดจาก StandardError .
ซึ่งเป็นข้อยกเว้นมากที่สุด
ทำไมมันไม่ดี
เนื่องจากวิธีที่ดีที่สุดคือจัดการกับข้อยกเว้นเฉพาะ แทนที่จะเลือกอย่างกว้างๆ
วิธีนี้จะช่วยหลีกเลี่ยงการซ่อนข้อผิดพลาดจากตัวคุณเอง!
ข้อผิดพลาดที่ซ่อนอยู่สามารถนำไปสู่พฤติกรรมแปลก ๆ และปัญหาที่ยากต่อการแก้ไข
สรุป
คุณได้เรียนรู้ข้อผิดพลาดใน Ruby การจัดการข้อยกเว้นพื้นฐาน &rescue / begin คีย์เวิร์ด
โปรดแบ่งปันบทความนี้หากคุณพบว่ามีประโยชน์ 🙂
ขอบคุณสำหรับการอ่าน!