0Pricing
Python Academy · บทเรียน

คลาสข้อยกเว้นแบบกำหนดเอง

กำหนดชนิดข้อยกเว้นของคุณเองเพื่อสื่อสารข้อผิดพลาดได้ชัดเจนยิ่งขึ้น

คลาสข้อยกเว้นแบบกำหนดเอง เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

บทนำ

คลาสข้อยกเว้นแบบกำหนดเองช่วยให้การจัดการข้อผิดพลาดชัดเจน อธิบายตัวเองได้ และง่ายต่อการให้ผู้เรียกใช้จัดการอย่างแม่นยำ

เหตุผลที่ต้องใช้ข้อยกเว้นแบบกำหนดเอง

ข้อยกเว้นในตัวมีความกว้างเกินไป ข้อยกเว้นแบบกำหนดเองช่วยให้ผู้เรียกใช้ดักจับเฉพาะข้อผิดพลาดของไลบรารีของ YOUR ได้ โดยไม่ดักจับข้อผิดพลาดที่ไม่เกี่ยวข้อง
class AppError(Exception):
    pass
raise AppError('something went wrong')

การสืบทอดจาก Exception

class MyError(Exception): pass คือทั้งหมดที่ต้องใช้ ควรสืบทอดจาก Exception เสมอ ไม่ใช่ BaseException
class ValidationError(Exception):
    pass
try:
    raise ValidationError('email is invalid')
except ValidationError as e:
    print(e)

การเพิ่มแอตทริบิวต์แบบกำหนดเอง

class APIError(Exception): def __init__(self, status, message): self.status = status; super().__init__(message)
class APIError(Exception):
    def __init__(self, status, message):
        self.status = status
        super().__init__(message)
try:
    raise APIError(404, 'Not found')
except APIError as e:
    print(e.status, e)

ลำดับชั้นของข้อยกเว้น

สร้างลำดับชั้น: class DBError(AppError): pass — ผู้เรียกใช้สามารถดักจับ AppError เพื่อจัดการข้อผิดพลาดของแอปทั้งหมด หรือดักจับ DBError โดยเฉพาะได้
class AppError(Exception): pass
class DBError(AppError): pass
class NetworkError(AppError): pass
try:
    raise DBError('timeout')
except AppError as e:
    print('app error:', e)

เมธอด __str__ แบบกำหนดเอง

เขียนทับ __str__ เพื่อควบคุมลักษณะของข้อความข้อยกเว้นเมื่อพิมพ์ออกมา
class RangeError(ValueError):
    def __init__(self, val, lo, hi):
        self.val, self.lo, self.hi = val, lo, hi
    def __str__(self):
        return f'{self.val} not in [{self.lo}, {self.hi}]'
print(RangeError(15, 0, 10))

การส่งข้อยกเว้นแบบกำหนดเอง

ใช้ raise ในฟังก์ชันของคุณเพื่อส่งสัญญาณข้อผิดพลาดเฉพาะโดเมน วิธีนี้ช่วยสร้าง API ที่สะอาดสำหรับผู้เรียกใช้
class InsufficientFundsError(Exception):
    def __init__(self, needed, available):
        super().__init__(f'Need {needed}, have {available}')
def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientFundsError(amount, balance)
    return balance - amount
try:
    withdraw(100, 200)
except InsufficientFundsError as e:
    print(e)

การดักจับด้วยคลาสแม่

except AppError จะดักจับคลาสลูกทั้งหมด ได้แก่ DBError, NetworkError และอื่น ๆ ลำดับชั้นช่วยให้ผู้เรียกใช้เลือกระดับความเฉพาะเจาะจงได้
class AppError(Exception): pass
class DBError(AppError): pass
try:
    raise DBError('conn failed')
except AppError:
    print('any app error')

ข้อยกเว้นร่วมกับตัวจัดการบริบท

ข้อยกเว้นแบบกำหนดเองทำงานร่วมกับตัวจัดการบริบทได้: class suppressed: __exit__ จะคืนค่า True เพื่อระงับข้อยกเว้น
class SuppressValue(Exception): pass
try:
    raise SuppressValue('ignored')
except SuppressValue:
    pass  # suppress silently
print('continued')

การจัดทำเอกสารข้อยกเว้นแบบกำหนดเอง

จัดทำเอกสารว่า WHEN ควรส่งข้อยกเว้นและ WHAT คือความหมายของแอตทริบิวต์ต่าง ๆ ข้อความเอกสารที่ดีช่วยให้ใช้งานข้อยกเว้นแบบกำหนดเองได้ง่าย
class ConfigError(Exception):
    """Raised when configuration is invalid.
    Attributes:
        key: The invalid config key
    """
    def __init__(self, key, msg):
        super().__init__(msg)
        self.key = key

แนวทางปฏิบัติที่ดี

ทำให้ลำดับชั้นตื้น (2–3 ระดับ) สืบทอดจาก Exception เสมอ ใช้ชื่อที่สื่อความหมายและลงท้ายด้วย Error และวางไว้ในโมดูล exceptions.py โดยเฉพาะ
# Good structure:
class AppError(Exception): pass
class ValidationError(AppError): pass
class NotFoundError(AppError): pass
print('hierarchy demo')

ตรวจสอบความเข้าใจ

ข้อยกเว้นแบบกำหนดเองควรสืบทอดจากอะไรเพื่อหลีกเลี่ยงการดักจับเหตุการณ์ที่ทำให้ระบบออก?

สรุป

ข้อยกเว้นแบบกำหนดเองควรสืบทอดจาก Exception เพิ่มแอตทริบิวต์ใน __init__ และเขียนทับ __str__ สร้างลำดับชั้นเพื่อให้ดักจับได้ตามต้องการ และวางไว้ในโมดูล exceptions.py

ไปต่อ

ทำได้ดีมาก! ไปยังบทเรียนถัดไปเพื่อพัฒนาทักษะต่อไป

คำถามที่พบบ่อย

บทเรียน “คลาสข้อยกเว้นแบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คลาสข้อยกเว้นแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คลาสข้อยกเว้นแบบกำหนดเอง”

กำหนดชนิดข้อยกเว้นของคุณเองเพื่อสื่อสารข้อผิดพลาดได้ชัดเจนยิ่งขึ้น คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “คลาสข้อยกเว้นแบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ทำความเข้าใจข้อยกเว้น
  2. try / except / else / finally
  3. การยกและยกข้อยกเว้นซ้ำ
  4. คลาสข้อยกเว้นแบบกำหนดเอง
← กลับไปที่ Python Academy