อ่าน error ใน Python ให้เป็น และแก้บั๊กที่พบบ่อย
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
เมื่อผู้เริ่มต้นเห็นข้อความแจ้งข้อผิดพลาดสีแดง ปฏิกิริยาแรกคือตกใจ หน้าจอเต็มไปด้วยข้อความที่ดูน่ากลัว และคิดว่าตัวเองทำอะไรพังไปแล้ว แต่ความจริงคือ ข้อความแจ้งข้อผิดพลาดคือเพื่อนที่ดีที่สุดของคุณ มันบอกตรงๆ ว่าอะไรผิดพลาดและผิดที่ตรงไหน
โปรแกรมเมอร์มืออาชีพเจอ error ทุกวัน ความต่างระหว่างผู้เริ่มต้นกับผู้เชี่ยวชาญไม่ได้อยู่ที่ผู้เชี่ยวชาญไม่เคยเจอ error แต่อยู่ที่ผู้เชี่ยวชาญรู้วิธีอ่านมัน เมื่อคุณอ่านข้อความแจ้งข้อผิดพลาดของ Python เป็น การดีบักจะเปลี่ยนจากเรื่องน่ากลัวเป็นเรื่องที่ทำได้แทบจะอัตโนมัติ
ในบทเรียนนี้ คุณจะได้เรียนวิธีอ่าน traceback ของ Python ทำความเข้าใจ error หกชนิดที่พบบ่อยที่สุด และสร้างชุดวิธีคิดสำหรับแก้บั๊กได้อย่างรวดเร็ว
วิธีอ่าน traceback ของ Python
เมื่อ Python เจอข้อผิดพลาด มันจะแสดง traceback ซึ่งเป็นรายงานที่บอกว่าเกิดอะไรขึ้น คนส่วนใหญ่อ่าน traceback จากบนลงล่าง ซึ่งเป็นการอ่านกลับด้าน ให้เริ่มอ่านจาก บรรทัดสุดท้าย เสมอ
Traceback (most recent call last): File "<exec>", line 5, in <module> File "<exec>", line 2, in greet TypeError: can only concatenate str (not "int") to str
เมื่อรันโค้ดนี้ Python จะแสดง traceback ออกมา นี่คือวิธีอ่าน โดยเริ่มจากด้านล่าง:
SyntaxError: Python ไม่เข้าใจโค้ดของคุณ
SyntaxError หมายความว่า Python ยังเริ่มรันโค้ดของคุณไม่ได้เลย เพราะโครงสร้างของโค้ดผิด เหมือนประโยคที่ผิดไวยากรณ์จนอ่านไม่รู้เรื่อง Python จับข้อผิดพลาดแบบนี้ได้ก่อนจะรันแม้แต่บรรทัดเดียว
SyntaxError: expected ':' (<string>, line 1) Common SyntaxError causes: 1. Missing colon after if/else/for/while/def 2. Mismatched parentheses or quotes 3. Using = instead of == in conditions 4. Incorrect indentation
ข่าวดีคือ SyntaxError มักแก้ง่ายที่สุด Python มักชี้ไปที่ปัญหาตรงๆ ด้วยลูกศรเล็กๆ (^) ที่แสดงจุดที่มันสับสน
if temperature > 30
print('Hot!')if temperature > 30:
print('Hot!')NameError: Python หาชื่อนั้นไม่เจอ
NameError หมายความว่าคุณใช้ชื่อตัวแปรหรือชื่อฟังก์ชันที่ Python ไม่รู้จัก โดยปกติแปลว่าคุณพิมพ์ผิด ลืมสร้างตัวแปร หรือใช้ตัวแปรก่อนกำหนดค่าให้มัน
NameError: name 'usernme' is not defined NameError: name 'score' is not defined
total_price = 49.99
print(total_prce) # typo!total_price = 49.99
print(total_price)TypeError: ชนิดข้อมูลไม่เหมาะกับการดำเนินการ
TypeError หมายความว่าคุณพยายามทำบางอย่างกับข้อมูลผิดชนิด เช่น บวกสตริงกับตัวเลข หรือเรียกสิ่งที่ไม่ใช่ฟังก์ชัน Python รู้ว่าคุณต้องการอะไร แต่ชนิดข้อมูลไม่ตรงกัน
TypeError: can only concatenate str (not "int") to str TypeError: can't multiply sequence by non-int of type 'str' TypeError: add() takes 2 positional arguments but 3 were given
TypeError มักโผล่ขึ้นมาเมื่อทำงานกับข้อมูลที่ผู้ใช้ป้อน (ซึ่งเป็นสตริงเสมอ) หรือเมื่อฟังก์ชันคืนค่า None โดยไม่คาดคิด
age = 25
print('You are ' + age + ' years old')age = 25
print(f'You are {age} years old')IndexError และ KeyError: เข้าถึงสิ่งที่ไม่มีอยู่
IndexError เกิดเมื่อคุณพยายามเข้าถึงตำแหน่งในลิสต์ที่ไม่มีอยู่ KeyError เกิดเมื่อคุณพยายามเข้าถึงคีย์ของดิกชันนารีที่ไม่มีอยู่ ทั้งสองแบบหมายความว่าคุณกำลังหยิบสิ่งที่ไม่มีอยู่ตรงนั้น
IndexError: list index out of range List length: 3 Valid indices: 0 to 2 KeyError: 'email'
สำหรับดิกชันนารี คุณเลี่ยง KeyError ได้ด้วยเมธอด .get() ซึ่งคืนค่าเริ่มต้นแทนที่จะทำให้โปรแกรมหยุดทำงาน
user = {'name': 'Alice'}
email = user['email'] # KeyError!user = {'name': 'Alice'}
email = user.get('email', 'Not provided')
print(email) # Not providedValueError: ชนิดถูก แต่ค่าผิด
ValueError หมายความว่าชนิดข้อมูลถูกต้อง แต่ค่าจริงไม่สมเหตุสมผลสำหรับการดำเนินการนั้น ตัวอย่างคลาสสิกคือการพยายามแปลงสตริงที่ไม่ใช่ตัวเลขเป็นจำนวนเต็ม
ValueError: invalid literal for int() with base 10: 'hello' ValueError: invalid literal for int() with base 10: '3.14' Converted: 3
ValueError เกิดบ่อยเมื่อประมวลผลข้อมูลที่ผู้ใช้ป้อน ผู้ใช้อาจพิมพ์ "ยี่สิบ" แทน "20" หรือปล่อยช่องว่างไว้ ควรตรวจสอบข้อมูลก่อนแปลงชนิดเสมอ
"abc" is not a valid number
เคล็ดลับการดีบักที่ใช้บ่อย
นี่คือคู่มือสั้นๆ สำหรับดีบักโค้ด Python เทคนิคเหล่านี้ใช้ได้กับข้อผิดพลาดทุกชนิด
นี่คือตารางสรุปข้อผิดพลาดที่คุณจะเจอบ่อยที่สุด:
| ข้อผิดพลาด | ความหมาย | วิธีแก้เร็วๆ |
|---|---|---|
SyntaxError | โครงสร้างโค้ดผิด | ตรวจโคลอน วงเล็บ เครื่องหมายคำพูด |
NameError | หาตัวแปร/ฟังก์ชันไม่เจอ | ตรวจการสะกด สร้างก่อนใช้ |
TypeError | ชนิดข้อมูลผิด | แปลงชนิดข้อมูล หรือตรวจอาร์กิวเมนต์ของฟังก์ชัน |
IndexError | ดัชนีลิสต์เกินขอบเขต | ตรวจความยาวลิสต์ จำไว้ว่าดัชนีเริ่มที่ 0 |
KeyError | ไม่พบคีย์ในดิกชันนารี | ใช้ .get() หรือตรวจว่ามีคีย์นั้นอยู่ |
ValueError | ชนิดถูก ค่าผิด | ตรวจสอบข้อมูลก่อนแปลงชนิด |
แบบฝึกหัด
ถึงเวลาฝึกทักษะการดีบักแล้ว แบบฝึกหัดส่วนใหญ่ให้โค้ดที่มีบั๊กมาให้คุณแก้ อ่านข้อความแจ้งข้อผิดพลาด หาบั๊ก แล้วซ่อมให้ถูก
โค้ดนี้มี SyntaxError หาแล้วแก้ให้แสดงผล:
Python is fun!
Let's learn more.โค้ดนี้มี NameError หาจุดที่พิมพ์ผิดแล้วแก้ให้แสดงผล:
Hello, Alice! You have 3 new messages.โค้ดนี้มี TypeError แก้ให้แสดงผล:
Your total is $37.5โค้ดนี้พยายามแสดงสีสุดท้าย แต่หยุดทำงานด้วย IndexError แก้ให้แสดงผล:
Last color: greenโค้ดนี้หยุดทำงานเมื่อพยายามแปลงสตริงราคาเป็นจำนวนเต็ม แก้ให้แสดงผล:
Price in cents: 999ราคาคือ "9.99" ดอลลาร์ และเราต้องการแปลงเป็นเซนต์ (คูณด้วย 100 แล้วแปลงผลลัพธ์เป็นจำนวนเต็ม)
โค้ดนี้พังในทุกส่วนทั้งสามส่วน แม้ว่าการแก้จุดเดียวจะแก้ได้ถึงสองส่วน แก้โค้ดให้ได้ผลลัพธ์:
Student: Alice
Grade: 85
Passed: Trueสรุป: ข้อความแจ้งข้อผิดพลาดใน Python
นี่คือตารางสรุปข้อผิดพลาดที่พบบ่อยที่สุดใน Python:
| ข้อผิดพลาด | ความหมาย | สิ่งแรกที่ควรตรวจ |
|---|---|---|
SyntaxError | โครงสร้างโค้ดผิด | โคลอน วงเล็บ เครื่องหมายคำพูดที่หายไป |
NameError | ไม่รู้จักตัวแปร | การสะกด ลำดับการสร้างตัวแปร |
TypeError | ชนิดข้อมูลผิด | ตรวจชนิดด้วย type() |
IndexError | ดัชนีลิสต์ไม่ถูกต้อง | ความยาวลิสต์ ดัชนีเริ่มที่ 0 |
KeyError | คีย์ดิกชันนารีไม่ถูกต้อง | ใช้ .get() พร้อมค่าเริ่มต้น |
ValueError | ค่าผิด | ตรวจสอบก่อนแปลงชนิด |
กฎทองของการดีบัก:
print(type(x), x) ตรวจดูตัวแปรที่น่าสงสัยเรียนอะไรต่อ
เมื่ออ่านข้อความแจ้งข้อผิดพลาดเป็นแล้ว คุณก็พร้อมรับมือกับหัวข้อ Python ที่ซับซ้อนขึ้นอย่างมั่นใจ ไปต่อที่ ลิสต์ใน Python เพื่อเรียนรู้โครงสร้างข้อมูลที่ทรงพลังและใช้งานได้หลากหลายที่สุดอย่างหนึ่งของ Python