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

การยกและยกข้อยกเว้นซ้ำ

ใช้ raise เพื่อส่งสัญญาณข้อผิดพลาด และยกข้อยกเว้นซ้ำเพื่อส่งต่อ

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

บทนำ

คีย์เวิร์ด raise ช่วยให้คุณส่งสัญญาณข้อผิดพลาดอย่างชัดเจน การส่งข้อยกเว้นเดิมซ้ำจะรักษาบริบทของข้อผิดพลาดเดิมไว้

การส่งข้อยกเว้นในตัวด้วย raise

raise ValueError('message') จะส่งข้อยกเว้นประเภทนั้นขึ้นมาทันทีพร้อมข้อความที่กำหนด
def divide(a, b):
    if b == 0:
        raise ValueError('Denominator cannot be zero')
    return a / b
try:
    divide(5, 0)
except ValueError as e:
    print(e)

การส่งข้อยกเว้นเดิมซ้ำ

ภายใน except, raise (โดยไม่มีอาร์กิวเมนต์) จะส่งข้อยกเว้นปัจจุบันซ้ำ โดยรักษาแทรซแบ็กเดิมไว้
def process(data):
    try:
        return int(data)
    except ValueError:
        print('logging error')
        raise  # re-raises original
try:
    process('abc')
except ValueError:
    print('caller caught it')

การเชื่อมโยงข้อยกเว้นด้วย from

raise NewError('msg') from original เชื่อมโยงข้อยกเว้นเข้าด้วยกัน และกำหนดค่าให้ exc.__cause__
try:
    int('abc')
except ValueError as original:
    raise RuntimeError('processing failed') from original

การระงับการเชื่อมโยง

raise NewError() from None ตัดการเชื่อมโยง ทำให้ข้อยกเว้นเดิมไม่ปรากฏในแทรซแบ็ก
try:
    int('abc')
except ValueError:
    raise RuntimeError('clean error') from None

คำสั่ง assert

assert condition, 'message' จะส่ง AssertionError หาก condition เป็น False ใช้สำหรับตรวจสอบเงื่อนไขคงที่ระหว่างการพัฒนาเท่านั้น
def sqrt(x):
    assert x >= 0, f'Input must be non-negative, got {x}'
    return x ** 0.5
try:
    sqrt(-1)
except AssertionError as e:
    print(e)

การส่งข้อยกเว้นตามเงื่อนไข

การวางส่วนตรวจสอบด้วย raise ไว้ด้านบนของฟังก์ชันช่วยให้เงื่อนไขเบื้องต้นชัดเจนและหลีกเลี่ยงการซ้อนบล็อกลึกเกินไป
def process(items):
    if not items:
        raise ValueError('items must not be empty')
    return items[0]
print(process([1, 2, 3]))

การส่งซ้ำกับการส่งข้อยกเว้นใหม่

การส่งซ้ำ (raise เปล่า) จะรักษาบริบทไว้ ส่วนข้อยกเว้นใหม่จะซ่อนบริบทเดิม ใช้การเชื่อมโยงเพื่อให้มองเห็นทั้งสองส่วน
def outer():
    try:
        inner()
    except ValueError as e:
        raise RuntimeError('outer failed') from e
def inner():
    raise ValueError('inner failed')
try:
    outer()
except RuntimeError as e:
    print(e, e.__cause__)

ข้อยกเว้นใน finally

การส่งข้อยกเว้นใน finally จะแทนที่ข้อยกเว้นเดิม หลีกเลี่ยงการส่งข้อยกเว้นใน finally เว้นแต่จำเป็นอย่างยิ่ง
try:
    try:
        raise ValueError('original')
    finally:
        print('finally ran')
except ValueError as e:
    print('caught:', e)

warnings.warn กับ raise

ใช้ warn() สำหรับข้อผิดพลาดแบบไม่รุนแรงที่กู้คืนได้ และใช้ raise สำหรับข้อผิดพลาดที่ต้องจัดการ ทั้งสองอย่างมีจุดประสงค์ต่างกัน
import warnings
def old_func():
    warnings.warn('Deprecated', DeprecationWarning)
    return 42
print(old_func())

รูปแบบ raise from None

เมื่อแปลงข้อยกเว้นจากไลบรารีเป็นข้อยกเว้นของ API ของคุณเอง ให้ใช้ from None เพื่อไม่เปิดเผยรายละเอียดภายใน
class DBError(Exception): pass
def query(q):
    try:
        raise ConnectionError('refused')
    except ConnectionError:
        raise DBError('query failed') from None
try:
    query('SELECT 1')
except DBError as e:
    print(e)

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

'raise' (โดยไม่มีอาร์กิวเมนต์) ทำอะไรภายในบล็อก except?

สรุป

raise Type('msg') ใช้ส่งสัญญาณข้อผิดพลาด raise เปล่าใช้ส่งข้อยกเว้นเดิมซ้ำ raise New from Old ใช้เชื่อมโยงข้อยกเว้น และ raise New from None ใช้ระงับบริบท ส่วน assert ใช้ตรวจสอบเงื่อนไขคงที่ระหว่างการพัฒนา

ไปต่อ

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

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

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

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

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

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

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

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

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

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

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

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

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

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