การกำหนดข้อยกเว้นแบบไม่มีพารามิเตอร์:
class MyException(Exception):
pass
เมื่อยกขึ้นมีความแตกต่างระหว่าง:
raise MyException
และ
raise MyException()
ฉันไม่พบเลย มันเป็นเพียงไวยากรณ์ที่มากเกินไปหรือไม่?
การกำหนดข้อยกเว้นแบบไม่มีพารามิเตอร์:
class MyException(Exception):
pass
เมื่อยกขึ้นมีความแตกต่างระหว่าง:
raise MyException
และ
raise MyException()
ฉันไม่พบเลย มันเป็นเพียงไวยากรณ์ที่มากเกินไปหรือไม่?
คำตอบ:
คำตอบสั้น ๆ คือทั้งสองอย่างraise MyException
และraise MyException()
ทำสิ่งเดียวกัน แบบฟอร์มแรกนี้จะสร้างอินสแตนซ์ข้อยกเว้นของคุณโดยอัตโนมัติ
ส่วนที่เกี่ยวข้องจากเอกสารระบุว่า " Raiseประเมินนิพจน์แรกเป็นอ็อบเจ็กต์ข้อยกเว้นซึ่งต้องเป็นคลาสย่อยหรืออินสแตนซ์ของ BaseException หากเป็นคลาสอินสแตนซ์ข้อยกเว้นจะได้รับเมื่อจำเป็นโดยการสร้างอินสแตนซ์คลาสด้วย ไม่มีข้อโต้แย้ง "
แม้ว่าความหมายจะเหมือนกัน แต่รูปแบบแรกจะเร็วกว่าด้วยกล้องจุลทรรศน์และรูปแบบที่สองมีความยืดหยุ่นมากกว่า (เพราะคุณสามารถส่งผ่านข้อโต้แย้งได้หากจำเป็น)
รูปแบบปกติที่คนส่วนใหญ่ใช้ใน Python (เช่นในไลบรารีมาตรฐานในแอปพลิเคชันยอดนิยมและในหนังสือหลายเล่ม) คือการใช้raise MyException
เมื่อไม่มีข้อโต้แย้ง ผู้คนจะสร้างอินสแตนซ์ของข้อยกเว้นโดยตรงเมื่อจำเป็นต้องส่งผ่านข้อโต้แย้งบางประการเท่านั้น ตัวอย่างเช่น: raise KeyError(badkey)
.
มองไปที่เอกสารสำหรับraise
คำสั่ง มันกำลังสร้างอินสแตนซ์ของMyException
.
raise
มีการเปลี่ยนแปลงเล็กน้อยใน Python 3 ส่วนที่เกี่ยวข้องกับคำถามนี้จะเหมือนกัน ( raise ExceptionType
ยังคงสร้างอินสแตนซ์ของประเภทโดยเรียกตัวสร้างโดยไม่มีข้อโต้แย้ง)
ใช่มีความแตกต่างระหว่างValueError
และValueError()
ValueError
เป็นคลาสในขณะที่ValueError()
สร้างอินสแตนซ์ของคลาส นี่คือเหตุผลที่type(ValueError) is type
และtype(ValueError()) is ValueError
จุดประสงค์เดียวraise
คือการเพิ่มข้อยกเว้น
เมื่อเราใช้
ValueError
คลาสจะถูกเรียกซึ่งจะเรียกใช้คอนสตรัคเตอร์ValueError()
เมื่อเราใช้
ValueError()
วิธีValueError()
นี้จะถูกเรียกโดยตรง
บันทึก: raise ValueError # shorthand for 'raise ValueError()'