ปัญหาที่พบบ่อยใน 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
คีย์เวิร์ด
โปรดแบ่งปันบทความนี้หากคุณพบว่ามีประโยชน์ 🙂
ขอบคุณสำหรับการอ่าน!