การจัดการข้อยกเว้น
ก่อนที่จะเริ่มสร้าง exception แบบกำหนดเองขึ้นมาเอง ลองทบทวนพื้นฐานการจัดการ exception กันก่อน
ในแบบฝึกหัดนี้ มีฟังก์ชัน invert_at_index(x, ind) ที่รับอาร์กิวเมนต์สองตัว ได้แก่ ลิสต์ x และ index ind แล้วคืนค่าส่วนกลับของสมาชิกในลิสต์ที่ตำแหน่งนั้น ตัวอย่างเช่น invert_at_index([5,6,7], 1) จะคืนค่า 1/6 หรือ 0.166666
ลองรันโค้ดตามที่เป็นอยู่แล้วดูผลลัพธ์ใน console ฟังก์ชันนี้มีการดำเนินการที่อาจเกิดข้อผิดพลาดได้สองจุด ได้แก่ ถ้าค่าที่ต้องการหาส่วนกลับมีค่าเป็น 0 โค้ดจะเกิด exception ZeroDivisionError และถ้า index ที่ส่งเข้ามาอยู่นอกช่วงของลิสต์ โค้ดจะเกิด IndexError ซึ่งในทั้งสองกรณี สคริปต์จะหยุดทำงานกลางคัน ซึ่งอาจไม่เป็นที่ต้องการ
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การเขียนโปรแกรมเชิงวัตถุใน Python
คำแนะนำการฝึกหัด
ใช้รูปแบบ try - except - except (โดยมีสองบล็อก except) ภายในฟังก์ชัน เพื่อดักจับและจัดการ exception ทั้งสองแบบดังนี้
tryรันโค้ดตามที่เป็นอยู่- ถ้าเกิด
ZeroDivisionErrorให้พิมพ์"Cannot divide by zero!" - ถ้าเกิด
IndexErrorให้พิมพ์"Index out of range!"
รู้ว่าทำถูกต้องแล้ว เมื่อโค้ดรันได้โดยไม่มีข้อผิดพลาด และผลลัพธ์ใน console เป็นดังนี้:
0.16666666666666666
Cannot divide by zero!
None
Index out of range!
None
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
# MODIFY the function to catch exceptions
def invert_at_index(x, ind):
return 1/x[ind]
a = [5,6,0,7]
# Works okay
print(invert_at_index(a, 1))
# Potential ZeroDivisionError
print(invert_at_index(a, 2))
# Potential IndexError
print(invert_at_index(a, 5))