อาร์กิวเมนต์หลักของหนังสือเล่มนี้คือรหัสรุ่นยกเว้นนั้นดีกว่าเพราะจะจับสิ่งใดก็ได้ที่คุณอาจมองข้ามถ้าคุณพยายามเขียนการตรวจสอบข้อผิดพลาดของคุณเอง
ฉันคิดว่าข้อความนี้เป็นจริงเฉพาะในสถานการณ์ที่เฉพาะเจาะจงมาก - ที่คุณไม่สนใจว่าผลลัพธ์ถูกต้อง
ไม่ต้องสงสัยเลยว่าการยกข้อยกเว้นเป็นวิธีที่ปลอดภัยและปลอดภัย คุณควรทำเช่นนั้นเมื่อใดก็ตามที่คุณรู้สึกว่ามีบางสิ่งอยู่ในสถานะปัจจุบันของโปรแกรมที่คุณ (ในฐานะนักพัฒนา) ไม่สามารถจัดการหรือไม่ต้องการ
อย่างไรก็ตามตัวอย่างของคุณเกี่ยวกับการจับข้อยกเว้น หากคุณพบข้อยกเว้นคุณไม่ได้ป้องกันตนเองจากสถานการณ์ที่คุณอาจมองข้าม คุณกำลังทำสิ่งที่ตรงกันข้าม: คุณคิดว่าคุณไม่ได้มองข้ามสถานการณ์ใด ๆ ที่อาจทำให้เกิดข้อยกเว้นประเภทนี้ดังนั้นคุณจึงมั่นใจว่าไม่เป็นไรที่จะจับมัน (และป้องกันไม่ให้โปรแกรมออกจากโปรแกรม) เป็นข้อยกเว้นใด ๆ ที่ไม่ถูกตรวจจับ)
ใช้วิธีการยกเว้นถ้าคุณเห็นValueError
ข้อยกเว้นคุณข้ามบรรทัด การใช้วิธีการที่ไม่ใช่ข้อยกเว้นแบบดั้งเดิมคุณจะนับจำนวนค่าที่ส่งคืนจากsplit
และถ้าน้อยกว่า 2 คุณจะข้ามบรรทัด คุณควรรู้สึกปลอดภัยมากขึ้นด้วยวิธีการยกเว้นเนื่องจากคุณอาจลืม "ข้อผิดพลาด" สถานการณ์อื่น ๆ ในการตรวจสอบข้อผิดพลาดแบบดั้งเดิมของคุณและexcept ValueError
จะจับพวกเขาให้คุณ?
ขึ้นอยู่กับลักษณะของโปรแกรมของคุณ
หากคุณกำลังเขียนตัวอย่างเช่นเว็บเบราว์เซอร์หรือเครื่องเล่นวิดีโอปัญหาเกี่ยวกับอินพุตไม่ควรทำให้เกิดปัญหากับข้อยกเว้นที่ไม่ได้ตรวจสอบ มันจะดีกว่าที่จะเอาท์พุทบางอย่างที่เหมาะสมจากระยะไกล (แม้ว่าการพูดอย่างเคร่งครัดไม่ถูกต้อง) กว่าจะเลิก
หากคุณกำลังเขียนแอปพลิเคชันที่มีความถูกต้อง (เช่นซอฟต์แวร์ทางธุรกิจหรือวิศวกรรม) นี่จะเป็นวิธีที่แย่มาก หากคุณลืมเกี่ยวกับบางสถานการณ์ที่เพิ่มขึ้นValueError
สิ่งที่แย่ที่สุดที่คุณสามารถทำได้คือการเพิกเฉยต่อสถานการณ์ที่ไม่รู้จักนี้โดยไม่ตั้งใจและข้ามบรรทัดนั้นไป นั่นเป็นวิธีที่ข้อบกพร่องที่ลึกซึ้งและมีราคาแพงสิ้นสุดลงในซอฟต์แวร์
คุณอาจคิดว่าวิธีเดียวที่คุณสามารถดูValueError
ในรหัสนี้คือถ้าsplit
ส่งคืนค่าเดียวเท่านั้น (แทนที่จะเป็นสองค่า) แต่ถ้าหากprint
คำสั่งของคุณเริ่มใช้นิพจน์ที่เพิ่มขึ้นValueError
ภายใต้เงื่อนไขบางประการ สิ่งนี้จะทำให้คุณข้ามบางบรรทัดไม่ได้เพราะพวกเขาพลาด:
แต่เป็นเพราะprint
พวกเขาล้มเหลว นี่คือตัวอย่างของข้อผิดพลาดที่ละเอียดอ่อนที่ฉันอ้างถึงก่อนหน้านี้ - คุณจะไม่สังเกตเห็นอะไรเลยเพียงแค่สูญเสียบางบรรทัด
คำแนะนำของฉันคือการหลีกเลี่ยงการจับ (แต่ไม่ยก!) ข้อยกเว้นในรหัสที่ผลิตผลลัพธ์ไม่ถูกต้องเลวร้ายยิ่งกว่าออก ครั้งเดียวที่ฉันได้รับการยกเว้นในรหัสดังกล่าวคือเมื่อฉันมีการแสดงออกที่น่ารำคาญอย่างแท้จริงดังนั้นฉันจึงสามารถเหตุผลได้อย่างง่ายดายว่าอะไรที่อาจทำให้เกิดข้อยกเว้นแต่ละประเภทที่เป็นไปได้
สำหรับผลกระทบด้านประสิทธิภาพของการใช้ข้อยกเว้นนั้นเป็นเรื่องเล็กน้อย (เป็น Python) ยกเว้นว่ามีข้อยกเว้นเกิดขึ้นบ่อยครั้ง
หากคุณใช้ข้อยกเว้นเพื่อจัดการกับเงื่อนไขที่เกิดขึ้นเป็นประจำคุณอาจจ่ายค่าประสิทธิภาพจำนวนมากในบางกรณี ตัวอย่างเช่นสมมติว่าคุณดำเนินการคำสั่งบางอย่างจากระยะไกล คุณสามารถตรวจสอบว่าข้อความคำสั่งของคุณผ่านการตรวจสอบขั้นต่ำอย่างน้อยที่สุด (เช่นไวยากรณ์) หรือคุณอาจรอให้มีการยกข้อยกเว้น (ซึ่งจะเกิดขึ้นหลังจากรีโมตเซิร์ฟเวอร์แยกวิเคราะห์คำสั่งของคุณและพบปัญหากับมัน) เห็นได้ชัดว่าอดีตคือคำสั่งของขนาดได้เร็วขึ้น อีกตัวอย่างง่ายๆ: คุณสามารถตรวจสอบว่าตัวเลขเป็นศูนย์ ~ 10 ครั้งเร็วกว่าการพยายามดำเนินการหารแล้วตรวจจับข้อยกเว้น ZeroDivisionError
ข้อควรพิจารณาเหล่านี้มีความสำคัญหากคุณส่งสตริงคำสั่งที่มีรูปแบบไม่ถูกต้องไปยังเซิร์ฟเวอร์ระยะไกลหรือรับอาร์กิวเมนต์ที่มีค่าเป็นศูนย์ซึ่งคุณใช้สำหรับการหาร
หมายเหตุ: ฉันคิดว่าคุณจะใช้except ValueError
แทนที่จะเป็นเพียงแค่except
; ดังที่คนอื่น ๆ ชี้ให้เห็นและอย่างที่หนังสือเล่มนี้พูดในสองสามหน้าคุณไม่ควรใช้ความโล่งexcept
อก
ทราบอีก: วิธีการที่ไม่ใช่ข้อยกเว้นที่เหมาะสมคือการนับจำนวนของค่าที่ส่งกลับโดยแทนที่จะค้นหาsplit
:
หลังช้าเกินไปเนื่องจากมันทำซ้ำงานที่ทำโดยsplit
และอาจเกือบสองเท่าของเวลาดำเนินการ