โปรแกรมเมอร์ที่เก่งไม่ได้วัดกันที่เขียนโค้ดให้รันได้เพียงอย่างเดียวครับ แต่วัดกันที่การคาดการณ์ว่า "อะไรจะพังได้บ้าง" และเตรียมแผนรับมือไว้ล่วงหน้า ในภาษา Python เราเรียกสิ่งนี้ว่า Exception Handling ครับ
1. Exception คืออะไร?
Exception คือข้อผิดพลาดที่เกิดขึ้นในขณะที่โปรแกรมกำลังทำงาน (Runtime Error) ซึ่งต่างจาก Syntax Error (ที่เขียนโค้ดผิดไวยากรณ์จนรันไม่ได้แต่แรก)
ตัวอย่างเหตุการณ์ที่ทำให้โปรแกรมพัง:
- ผู้ใช้กรอกตัวอักษรในช่องที่ต้องใส่ตัวเลข
- สั่งให้หารด้วยเลข 0 ()
- พยายามเปิดไฟล์ที่ไม่มีอยู่จริงในเครื่อง
2. โครงสร้าง Try-Except (แผนรับมือเหตุฉุกเฉิน)
เราจะใช้บล็อก try และ except เพื่อดักจับข้อผิดพลาดครับ
try:
# โค้ดที่ "เสี่ยง" ว่าจะพัง
number = int(input("กรุณากรอกตัวเลข: "))
result = 10 / number
print(f"ผลลัพธ์คือ: {result}")
except:
# โค้ดที่จะทำงาน "เมื่อเกิด Error"
print("❌ เกิดข้อผิดพลาด! กรุณาตรวจสอบว่าคุณใส่ตัวเลขที่ไม่ใช่ 0")
3. เจาะจงชนิดของ Error (Specific Errors)
การใช้ except ลอยๆ อาจจะกว้างไปครับ ในการทำงานจริงเราควรระบุไปเลยว่าอยากดัก Error ตัวไหน เพื่อให้แจ้งเตือนผู้ใช้ได้ตรงจุด
| ชื่อ Error | สาเหตุที่เกิด |
|---|---|
ValueError |
ค่าที่ใส่มาผิดประเภท (เช่น เอา String ไปแปลงเป็น Int) |
ZeroDivisionError |
พยายามหารตัวเลขด้วย 0 |
FileNotFoundError |
ค้นหาไฟล์ที่สั่งเปิดไม่เจอ |
IndexError |
พยายามเรียกลำดับใน List ที่ไม่มีอยู่จริง |
try:
with open("data.txt", "r") as f:
content = f.read()
except FileNotFoundError:
print("หาไฟล์ไม่เจอครับ ลองเช็กชื่อไฟล์อีกทีนะ")
except Exception as e:
print(f"เกิดข้อผิดพลาดอื่นๆ: {e}")
4. ตัวช่วยเสริม: Finally และ Else
else: จะทำงานก็ต่อเมื่อ "ไม่เกิด Error เลย"finally: จะทำงานเสมอ "ไม่ว่าจะพังหรือไม่พัง" (นิยมใช้ปิดไฟล์หรือตัดการเชื่อมต่อ Database)
Blockquote: "นึกถึง
finallyเหมือนการทำความสะอาดบ้าน ไม่ว่าปาร์ตี้ (โปรแกรม) จะสนุกหรือพังยับเยินแค่ไหน สุดท้ายคุณก็ต้องมาเก็บกวาดอยู่ดีครับ"
Workshop: โปรแกรมหารเลขที่ "ไม่มีวันตาย"
ลองเขียนระบบที่รับค่าจากผู้ใช้และจัดการทุก Error ที่อาจเกิดขึ้นดูครับ:
def safe_divide():
try:
num1 = float(input("ตัวตั้ง: "))
num2 = float(input("ตัวหาร: "))
result = num1 / num2
except ValueError:
print("Error: กรุณากรอกเป็นตัวเลขเท่านั้น!")
except ZeroDivisionError:
print("Error: ห้ามหารด้วยศูนย์!")
else:
print(f"✅ ผลลัพธ์คือ: {result}")
finally:
print("--- สิ้นสุดการทำงานของฟังก์ชัน ---")
safe_divide()
สรุป
การใช้ Try-Except จะทำให้แอปพลิเคชันของคุณดูเป็นมืออาชีพมากขึ้น (User Friendly) แทนที่จะปล่อยให้โปรแกรมค้างไปดื้อๆ คุณสามารถแสดงข้อความแนะนำที่สุภาพให้ผู้ใช้เข้าใจได้ครับ