ดักจับความล้มเหลวที่คาดการณ์ได้ด้วย try/except/else/finally และโยนข้อยกเว้นของคุณเองเพื่อแจ้งว่าข้อมูลไม่ถูกต้อง
เปิดบทเรียนนี้ใน Kodokonโปรแกรมจริงย่อมล้มเหลวได้ ไฟล์หาย ข้อมูลนำเข้าไม่ถูกต้อง เครือข่ายหลุด Python แจ้งสถานการณ์เหล่านี้ด้วย ข้อยกเว้น (exceptions) ซึ่งจะขัดจังหวะการทำงานและส่งต่อขึ้นไปตามกองซ้อนการเรียก จนกว่าจะมี try/except มาดักจับไว้ สัญชาตญาณของมืออาชีพคือ ดักจับ ข้อยกเว้นที่เจาะจงที่สุดเท่าที่ทำได้ ให้ใกล้ที่สุดกับจุดที่คุณรู้ว่าต้องทำอย่างไร
def parse_age(text):
try:
return int(text)
except ValueError:
return None
print(parse_age("34")) # 34
print(parse_age("thirty")) # Noneบล็อกฉบับเต็มมีสี่ส่วน try บรรจุโค้ดที่เสี่ยง except จัดการกับความล้มเหลว else ทำงาน เฉพาะเมื่อไม่มีข้อยกเว้น เกิดขึ้น และ finally ทำงาน ในทุกกรณี - เหมาะสำหรับคืนทรัพยากรหรือบันทึกล็อก ประโยชน์ของ else คือ ทำให้ try เล็กที่สุด คุณจึงเห็นได้ในพริบตาว่าบรรทัดไหนที่อาจล้มเหลว
values = ["10", "abc", "25"]
total = 0
for value in values:
try:
number = int(value)
except ValueError:
print(f"Skip : {value}")
else:
total += number
finally:
print(f"Process : {value}")
print(total) # 35ฟังก์ชันของคุณเองก็ โยน ข้อยกเว้นได้ด้วย raise ทันทีที่ข้อมูลที่รับเข้ามาไม่ถูกต้อง เพราะการล้มเหลวทันทีพร้อมข้อความที่ชัดเจน ย่อมดีกว่าการให้ผลลัพธ์ที่ผิด จงนิยามคลาสเฉพาะที่สืบทอดจาก Exception ผู้เรียกจะได้ดักจับมันอย่างเจาะจง โดยไม่เผลอไปดักข้อผิดพลาดอื่นด้วย
class EmptyCartError(Exception):
pass
def checkout(items):
if not items:
raise EmptyCartError("Empty cart.")
return round(sum(items), 2)
try:
print(checkout([]))
except EmptyCartError as error:
print(f"Error : {error}")