Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

คู่มือ Python Exceptions: ข้อผิดพลาดรันไทม์และการจัดการ

Exceptions สามารถถูก raise ขึ้นมาจาก Python interpreter หรือด้วยตนเอง Built-in exceptions ช่วยจับข้อผิดพลาดทั่วไปในโปรแกรม

ในคู่มือนี้ เราจะพูดถึงว่า exception คืออะไร และใช้ยังไง พร้อมตัวอย่างการ raise exception เพื่อให้คุณนำไปใช้ในโค้ดของตัวเอง

Exception คืออะไร?

Exception หรือ logical error คือข้อผิดพลาดที่เกิดขึ้นระหว่างรันโปรแกรม (runtime)

ใน Python มีข้อผิดพลาด 2 ประเภท: syntax errors และ runtime errors Syntax errors เกิดก่อนรันโปรแกรม หากโปรแกรมมี syntax error โปรแกรมจะรันไม่ได้ เพราะ Python ไม่สามารถ interpret โค้ดที่มี syntax error ได้

Runtime errors หรือ exceptions เกิดขณะ Python กำลังรันโปรแกรม Exception อาจเกิดที่บรรทัดที่ 30 ของโปรแกรม หาก exception เกิดที่บรรทัดที่ 30 โค้ด 30 บรรทัดแรกจะรันเสร็จก่อน แล้วโปรแกรมจึงหยุด

ตัวอย่าง exception:

Traceback (most recent call last):
  File "main.py", line 6, in 
    s_names.append(n)
AttributeError: 'str' object has no attribute 'append'

Exception นี้บอกว่า Python ไม่สามารถรันต่อได้ หากเจอ exception ควรอ่านข้อความอย่างละเอียด เพราะจะบอกข้อมูลเกือบหมดที่ต้องการเพื่อแก้ไข

มาวิเคราะห์ประโยคสุดท้ายของข้อความข้อผิดพลาด:

AttributeError: 'str' object has no attribute 'append'

ในกรณีนี้ เรารู้ว่า error เป็น AttributeError หมายถึงเราพยายามเข้าถึง attribute ที่ไม่มีอยู่ ข้อความบอกว่าเราพยายามใช้ append() บน string object ซึ่งไม่ได้รับอนุญาต

เนื่องจาก string objects ไร้ support method append() ขั้นตอนต่อไปคือหาวิธีเทียบเท่า append() สำหรับ strings นั่นคือ concatenation ตอนนี้เรามีวิธีแก้ไขที่เป็นไปได้

เราอาจพบ Exception ที่ไหน?

เพื่อช่วยนักเขียนโปรแกรมจับข้อผิดพลาด Python มี built-in exceptions หลายตัว ช่วยระบุสาเหตุปัญหาในโค้ด ด้านล่างคือ exceptions พบบ่อย:

  • TypeError: เกิดเมื่อใช้ฟังก์ชันกับ object ที่ชนิดข้อมูลไม่รองรับฟังก์ชันนั้น (เช่น TypeError: can only join an iterable)
  • SyntaxError: เกิดก่อนรันโปรแกรม บอกว่ามีปัญหาใน syntax (เช่น SyntaxError: invalid syntax)
  • KeyError: เกิดเมื่ออ้างอิง key ใน dictionary ที่ไม่มีอยู่ (เช่น KeyError: "usb_ports")
  • ImportError: เกิดเมื่อ import package ที่ไม่มีอยู่ หรือ function จาก package ที่ไม่มีอยู่

นี่เป็นเพียงบางส่วนของ exceptions มากมายใน Python

วิธี Raise Exception เอง

คุณสามารถกำหนด custom exceptions เองได้ หาก built-in exceptions ไม่ตอบสนองความต้องการของโปรแกรม

เราจะเขียนโปรแกรมตรวจสอบรหัสผ่านสำหรับเกม เริ่มต้นด้วยการให้ผู้ใช้ป้อนรหัสผ่าน:

password = input("Enter a password: ")

รหัสผ่านต้องยาวกว่า 12 ตัวอักษร หากสั้นกว่าหรือเท่ากับ 12 เราจะ raise exception

ใช้ if statement ตรวจสอบ:

if len(password) > 12:
    print("Your password is valid.")
else:
    raise Exception("Your password is not the correct length.")

เราใช้ len() คำนวณความยาวรหัสผ่าน หากผู้ใช้ป้อนรหัสผ่านไม่ถูกต้อง โปรแกรมจะ raise exception พร้อมข้อความ "Your password is not the correct length."

ลองรันโค้ด:

Enter a password: Bacon120
Traceback (most recent call last):
  File "main.py", line 6, in 
    raise Exception("Your password is not the correct length.")
Exception: Your password is not the correct length.

รหัสผ่านที่ป้อนสั้นกว่า 12 ตัวอักษร โค้ดหยุดทำงาน ลองรันกับรหัสผ่านที่ถูกต้อง:

Enter a password: Bacon120Bacon120
Your password is valid.

โปรแกรมทำงานสำเร็จ

วิธี Handle Exception (จัดการข้อผิดพลาด)

โดยค่าเริ่มต้น exceptions จะหยุดการทำงานของโปรแกรม แม้จะมีประโยชน์เพื่อบังคับให้หาแก้ไข แต่บางกรณีไม่ต้องการให้โปรแกรมหยุดเมื่อเจอ exception

เช่น ตรวจสอบข้อมูลใน list หาข้อมูลที่ไม่ถูกต้อง ไม่ต้องการให้ raise exception ทุกครั้งที่เจอข้อมูลผิด

ใช้ block "try...except" เพื่อจัดการ exception มาเขียนโปรแกรมหาข้อมูลใน dictionary ซึ่งมีชื่อนักเรียนและเกรดสอบล่าสุด

เริ่มต้นด้วยการกำหนด dictionary:

data = {
    "Lucy": 73,
    "Carlton": 59,
    "Adam": 73
}

ต่อมา ให้ผู้ใช้ป้อนชื่อนักเรียนที่ต้องการดูเกรด ทำใน "try" block เพื่อจัดการ exception ต่อไป:

try:
    student = input("Enter the name of the student whose grade you want to retrieve: ")
    print(data[student])

โค้ดจะพิมพ์เกรดของนักเรียนที่ชื่อตรงกับที่ผู้ใช้ป้อน แต่หากผู้ใช้ป้อนชื่อที่ไม่มี จะเกิด KeyError

เราจัดการโดยเพิ่ม except block:

try:
    student = input("Enter the name of the student whose grade you want to retrieve: ")
    print(data[student])
except:
    print("This student is not present in the list of grades.")

หากหานักเรียนไม่เจอ except clause จะทำงาน ลองรันโปรแกรม:

Enter the name of the student whose grade you want to retrieve: Lucy
73

ป้อนชื่อที่ถูกต้อง โปรแกรมทำงาน ลองป้อนชื่อที่ไม่มี:

Enter the name of the student whose grade you want to retrieve: Kaitlin
This student is not present in the list of grades.

Exception ถูก raise แต่โปรแกรมไม่หยุด แต่รันคำสั่งใน "except" block แทน

อ่านเพิ่มเติมเกี่ยวกับ try...except block ในคู่มือ Python try...except

สรุป

Exceptions แจ้งว่ามี logical error ในโค้ด เมื่อ exception ถูก raise คุณจะเห็นประเภท exception, ตำแหน่งที่เกิด, และข้อความข้อผิดพลาด ใช้ข้อมูลเหล่านี้หาสาเหตุ

คุณสามารถ raise exceptions เองด้วยคำสั่ง raise และจัดการ exceptions ด้วย block try...except

ตอนนี้คุณมีเครื่องมือแก้ไข Python exception อย่างมืออาชีพแล้ว!