Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีใช้คีย์เวิร์ด "เริ่มต้น" และ "กู้ภัย" ใน Ruby

ปัญหาที่พบบ่อยใน 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 คีย์เวิร์ด

โปรดแบ่งปันบทความนี้หากคุณพบว่ามีประโยชน์ 🙂

ขอบคุณสำหรับการอ่าน!