ฉันควร subclass ข้อยกเว้นใน Python เมื่อใด


10

ในรหัสของฉันมีประมาณเจ็ดแห่งที่ฉันแจ้งข้อยกเว้น ข้อยกเว้นเหล่านี้ทั้งหมดจะได้รับการปฏิบัติเช่นเดียวกัน: พิมพ์ข้อผิดพลาดไปยังล็อกไฟล์คืนสถานะซอฟต์แวร์กลับเป็นค่าเริ่มต้นและออก

ในระหว่างการตรวจสอบรหัสวิศวกรอาวุโสของฉันซึ่งฉันให้ความสำคัญมากบอกว่าฉันควรคลาสย่อยทั้งหมดยกเว้น เหตุผลของเขาคือในอนาคตเราอาจต้องการจัดการกับข้อยกเว้นต่างกันและจะง่ายขึ้น

ข้อโต้แย้งของฉันคือตอนนี้มันจะถ่วงโค้ดของเราเท่านั้นและเนื่องจากเราไม่รู้ว่าเราจะจัดการกับข้อยกเว้นต่างกันหรือไม่เราควรปล่อยให้รหัสย่อและถ้าเมื่อเวลามาแล้วเราควรจะพิมพ์ย่อย .

ฉันต้องการฟังอาร์กิวเมนต์สำหรับแต่ละกรณี


2
YAGNI ... คุณไม่ต้องการตอนนี้และคุณสามารถเพิ่มได้ในภายหลังโดยไม่ยากเกินไป
Robert Harvey

คุณมีตัวอย่างหรือไม่? คุณเพิ่งยกExceptionตัวอย่างเช่นหรือมีข้อผิดพลาดในตัวเฉพาะเจาะจงมากขึ้นหรือไม่
jonrsharpe

เพียงแค่เพิ่มข้อยกเว้น ("คำอธิบายเฉพาะ")
Ezra

@Ezra เป็นอย่างน้อยคุณควรดูว่ามีข้อยกเว้นในตัวที่เหมาะสมกว่านี้หรือไม่ (ดูdocs.python.org/2/library/exceptions.html )
jonrsharpe

คำตอบ:


8

คุณถูก

อาร์กิวเมนต์ด้านข้างของคุณได้รับการกล่าวถึงแล้วโดย Robert Harvey: อย่าเพิ่มรหัสที่คุณไม่ต้องการในตอนนี้โดยเฉพาะอย่างยิ่งเนื่องจากง่ายต่อการเพิ่มในภายหลัง

ผู้ตรวจสอบของคุณถูกต้องเช่นกัน

ในทางตรงกันข้ามประเด็นของผู้วิจารณ์ก็เป็นที่เข้าใจเช่นกัน:

  • การส่งคืนยาสามัญException()ไม่เป็นประโยชน์ต่อผู้โทร: ในขณะที่คำอธิบายข้อยกเว้นบ่งชี้ถึงมนุษย์ว่าเกิดอะไรขึ้นการรักษาข้อยกเว้นที่แตกต่างกันไป นักพัฒนาซอฟต์แวร์ที่ใช้รหัสของคุณอาจลังเลที่จะเปลี่ยนประเภทของข้อยกเว้นรวมถึงความกลัว (เป็นธรรมหรือไม่ก็ตาม) ที่จะทำลายบางสิ่ง

    โปรดทราบว่าการเพิ่มข้อยกเว้นที่กำหนดเองในตอนนี้ไม่ใช่เรื่องยาก :

    class MyCustomException(Exception):
        pass

    คือทั้งหมดที่คุณต้องการ นั่นเป็นเพียงโค้ดสองบรรทัด (เนื่องจากคุณอาจไม่จำเป็นต้องสร้างไฟล์แยกต่างหากหากคุณใส่ข้อยกเว้นที่กำหนดเองไว้ในไฟล์เดียว)

  • รหัสตัวเองดูดีขึ้นอ่านง่ายขึ้น

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    ดูเล็กน้อยอ่านได้มากขึ้นเมื่อเทียบกับ:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    เนื่องจากข้อบ่งชี้ประเภทของข้อยกเว้น:

    • ในโค้ดส่วนที่สองฉันต้องอ่านคำอธิบายและเดาว่าราคาอยู่นอกช่วง (หรืออาจจะไม่ใช่หรืออาจจะมีบางกรณีที่ราคาอาจเป็นลบได้เช่นส่วนลด)

    • ในส่วนแรกของโค้ดการเหลือบมองเหนือประเภทจะแสดงข้อผิดพลาดทันที ดูเหมือนว่ามีชุดของค่าที่อนุญาตสำหรับราคาและค่าปัจจุบันอยู่นอกชุดนี้

ดังนั้น?

ดังนั้น:

  • ทั้งสองวิธีนั้นถูกต้อง หากคุณไม่ซับคลาสข้อยกเว้นเมื่อคุณไม่ต้องการประเภทที่กำหนดเองคุณพูดถูก เมื่อคุณทำคลาสย่อยข้อยกเว้นเนื่องจากไม่มีค่าใช้จ่ายในการทำและอาจมีประโยชน์ในภายหลังคุณจะถูกต้อง

  • สอดคล้องกับทีมของคุณ หากทีมของคุณใช้ข้อยกเว้นที่กำหนดเองอย่างกว้างขวางให้ใช้พวกเขา


2
แต่มีสื่อที่มีความสุข: raise ValueError('The price is less than zero'). มันมีความเฉพาะเจาะจงมากกว่าฐานExceptionแต่ไม่มีความยุ่งยากใด ๆ
jonrsharpe

+1 สำหรับคำสั่งง่ายๆ "มีความสอดคล้อง" กับทีมหากคุณมีด้วยตัวคุณเองถ้าคุณไม่ได้
Styne666
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.