Try Except Python: ทำความเข้าใจและจัดการข้อยกเว้นด้วยเทคนิคขั้นสูง

目次

1. ข้อผิดพลาด (Exception) ใน Python คืออะไร

ข้อยกเว้น (Exception) ใน Python คือข้อผิดพลาดประเภทหนึ่งที่เกิดขึ้นระหว่างการทำงานของโปรแกรม โดยปกติแล้ว โปรแกรมจะทำงานตามลำดับจากบนลงล่าง แต่เมื่อเกิดข้อผิดพลาดในสถานการณ์เฉพาะ การทำงานของโค้ดในส่วนนั้นจะหยุดชะงักและเกิดข้อยกเว้นขึ้น ตัวอย่างเช่น การพยายามหารด้วยศูนย์จะทำให้เกิดZeroDivisionError และการพยายามเข้าถึงดัชนีของลิสต์ที่ไม่มีอยู่จะทำให้เกิดIndexError ครับ/ค่ะ

1.1 ประเภทของข้อผิดพลาดที่พบบ่อย

Python มีข้อผิดพลาดในตัว (Built-in Exceptions) อยู่มากมาย นี่คือตัวอย่างทั่วไปบางส่วน:

     

  • ValueError: เมื่อฟังก์ชันได้รับค่าที่ไม่เหมาะสม
  •  

  • TypeError: เมื่อการดำเนินการหรือฟังก์ชันทำงานกับชนิดข้อมูล (Data Type) ที่ไม่ถูกต้อง
  •  

  • IndexError: เมื่อพยายามเข้าถึงดัชนีที่อยู่นอกขอบเขตของลำดับ (เช่น ลิสต์)
  •  

  • ZeroDivisionError: เมื่อพยายามหารด้วยศูนย์

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

2. การจัดการข้อผิดพลาดพื้นฐานด้วย try และ except

ใน Python เราใช้ try และ except เพื่อจัดการข้อผิดพลาด ซึ่งช่วยป้องกันไม่ให้โปรแกรมหยุดทำงานเนื่องจากข้อผิดพลาด และยังคงสามารถทำงานต่อไปในส่วนอื่นของโปรแกรมได้แม้จะมีข้อผิดพลาดเกิดขึ้น

2.1 โครงสร้างพื้นฐาน

วางโค้ดที่มีโอกาสเกิดข้อผิดพลาดไว้ในบล็อก try และเขียนโค้ดที่จะทำงานในกรณีที่เกิดข้อผิดพลาดนั้นในบล็อก except

try:
    result = 10 / 0
except ZeroDivisionError:
    print("ไม่สามารถหารด้วยศูนย์ได้")

ในตัวอย่างนี้ เมื่อเกิด ZeroDivisionError บล็อก except จะทำงานและแสดงข้อความ “ไม่สามารถหารด้วยศูนย์ได้”

2.2 บล็อก except หลายบล็อก

หากต้องการจัดการข้อผิดพลาดหลายประเภท สามารถใช้บล็อก except หลายบล็อกได้ ตัวอย่างเช่น คุณสามารถกำหนดการจัดการที่แตกต่างกันสำหรับข้อผิดพลาดต่างๆ เช่น NameError หรือ TypeError

try:
    print(a)
except NameError:
    print('ตัวแปร a ไม่ได้ถูกกำหนด')
except TypeError:
    print('มีการใช้ชนิดข้อมูลที่ไม่ถูกต้อง')

ในโค้ดนี้ เนื่องจาก a ไม่ได้ถูกกำหนด (Defined) จึงเกิด NameError และแสดงข้อความที่เกี่ยวข้อง

3. วิธีการจัดการข้อผิดพลาดหลายรายการพร้อมกัน

หากโปรแกรมมีโอกาสเกิดข้อผิดพลาดหลายประเภท คุณสามารถจัดการข้อผิดพลาดเหล่านั้นพร้อมกันได้ในบล็อก except เดียว

3.1 การจัดการข้อผิดพลาดหลายรายการในบล็อก except เดียว

คุณสามารถระบุข้อผิดพลาดหลายรายการเป็น Tuple ในบล็อก except ได้ดังนี้:

try:
    num = int(input("กรุณาป้อนตัวเลข: "))
    result = 10 / num
except (ValueError, ZeroDivisionError):
    print("มีการป้อนข้อมูลที่ไม่ถูกต้อง หรือพยายามหารด้วยศูนย์")

ในตัวอย่างนี้ หากผู้ใช้ป้อนค่าที่ไม่ถูกต้องหรือพยายามหารด้วยศูนย์ จะมีการจัดการข้อผิดพลาดเหล่านั้นพร้อมกันและแสดงข้อความ “มีการป้อนข้อมูลที่ไม่ถูกต้อง หรือพยายามหารด้วยศูนย์”

3.2 การใช้คลาสหลัก (Parent Class) เพื่อจัดการข้อผิดพลาดพร้อมกัน

คลาส Exception เป็นคลาสหลักของข้อผิดพลาดในตัวส่วนใหญ่ หากต้องการดักจับข้อผิดพลาดทั้งหมด สามารถใช้คลาสนี้ได้ อย่างไรก็ตาม วิธีนี้ครอบคลุมมาก จึงควรใช้ด้วยความระมัดระวัง

try:
    # โค้ดที่มีโอกาสเกิดข้อผิดพลาด
except Exception as e:
    print("เกิดข้อผิดพลาด:", e)

วิธีนี้จะดักจับข้อผิดพลาดใดๆ ที่เกิดขึ้นและแสดงข้อความ อย่างไรก็ตาม ขอแนะนำให้ออกแบบเพื่อจัดการข้อผิดพลาดเฉพาะเจาะจงมากที่สุดเท่าที่จะเป็นไปได้

4. การสร้างข้อผิดพลาด (raise)

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

4.1 วิธีการใช้คำสั่ง raise

ในตัวอย่างต่อไปนี้ จะสร้าง ValueError หากมีการส่งค่าติดลบเข้ามา

def check_value(value):
    if value < 0:
        raise ValueError("ไม่อนุญาตให้ใช้ค่าติดลบ")
    return value

try:
    result = check_value(-1)
except ValueError as e:
    print(e)

ในตัวอย่างนี้ เนื่องจากมีการส่งค่าติดลบ -1 ไปยังฟังก์ชัน check_value จึงทำให้เกิด ValueError และแสดงข้อความ “ไม่อนุญาตให้ใช้ค่าติดลบ”

4.2 การประยุกต์ใช้ raise

คำสั่ง raise สามารถใช้เมื่อกำหนดคลาสข้อผิดพลาดที่กำหนดเอง (Custom Exception Classes) ได้ด้วย การสร้างข้อผิดพลาดของคุณเองและสร้างข้อผิดพลาดเหล่านั้นภายใต้เงื่อนไขเฉพาะ จะช่วยให้การจัดการข้อผิดพลาดของโปรแกรมมีความยืดหยุ่นมากขึ้น

5. การดึงข้อมูลข้อผิดพลาด

เมื่อเกิดข้อผิดพลาด การดึงข้อมูลรายละเอียดสามารถช่วยในการวินิจฉัยและดีบักปัญหาได้ง่ายขึ้น คุณสามารถดึงออบเจ็กต์ข้อผิดพลาดได้โดยใช้ as clause ในบล็อก except

5.1 วิธีการใช้ as clause

ในตัวอย่างต่อไปนี้ จะดึงออบเจ็กต์ข้อผิดพลาดเป็น e และแสดงข้อความของข้อผิดพลาดนั้น

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print("เกิดข้อผิดพลาด:", e)

ในโค้ดนี้ เมื่อเกิด ZeroDivisionError จะแสดงข้อความ “เกิดข้อผิดพลาด: division by zero” ออบเจ็กต์ข้อผิดพลาดประกอบด้วยข้อมูลโดยละเอียด เช่น ประเภทของข้อผิดพลาดและข้อความแสดงข้อผิดพลาด

5.2 การใช้ออบเจ็กต์ข้อผิดพลาด

ออบเจ็กต์ข้อผิดพลาดสามารถใช้สำหรับการบันทึก (Logging) หรือการดำเนินการเพิ่มเติมสำหรับข้อผิดพลาดเฉพาะเจาะจง นอกเหนือจากการแสดงข้อความ ตัวอย่างเช่น คุณสามารถเขียนข้อความข้อผิดพลาดลงในไฟล์บันทึก (Log file) เพื่อช่วยในการดีบักภายหลังได้

6. แนวทางปฏิบัติที่ดีที่สุด (Best Practices) ในการจัดการข้อผิดพลาด

การจัดการข้อผิดพลาดที่มีประสิทธิภาพช่วยเพิ่มความแข็งแกร่งและความน่าเชื่อถือของโปรแกรม นี่คือแนวทางปฏิบัติที่ดีที่สุดบางประการสำหรับการจัดการข้อผิดพลาดใน Python

6.1 ดักจับข้อผิดพลาดเฉพาะเจาะจง

พยายามดักจับข้อผิดพลาดเฉพาะเจาะจงให้มากที่สุดเท่าที่จะทำได้ แทนที่จะดักจับ Exception ที่ครอบคลุมทั้งหมด การดักจับข้อผิดพลาดที่คาดไว้ เช่น ValueError หรือ TypeError จะทำให้การจัดการข้อผิดพลาดชัดเจนและเป็นไปตามที่ตั้งใจมากขึ้น

6.2 บันทึกข้อผิดพลาดในล็อก

การบันทึกข้อความข้อผิดพลาดในล็อกทำให้ง่ายต่อการระบุสาเหตุของปัญหาในภายหลัง โดยเฉพาะอย่างยิ่งในโปรแกรมหรือระบบขนาดใหญ่ การบันทึกข้อมูลเมื่อเกิดข้อผิดพลาดเป็นสิ่งสำคัญ

6.3 การเสื่อมสภาพอย่างเหมาะสม (Graceful Degradation)

สิ่งสำคัญคือต้องออกแบบการเสื่อมสภาพอย่างเหมาะสม (Graceful Degradation) เพื่อไม่ให้โปรแกรมล่ม (Crash) แม้ว่าจะเกิดข้อผิดพลาดขึ้น ตัวอย่างเช่น การแสดงข้อความข้อผิดพลาดที่เข้าใจง่ายสำหรับผู้ใช้ หรือการเรียกใช้การทำงานสำรอง (Alternative operations) จะช่วยเพิ่มความน่าเชื่อถือของโปรแกรม

6.4 หลีกเลี่ยงการจัดการข้อผิดพลาดที่ซ้ำซ้อน

การดักจับข้อผิดพลาดทั้งหมดแล้วละเลยโดยไม่ทำอะไรเลยเป็นสิ่งที่ไม่ควรทำ เพราะจะทำให้การดีบักยากขึ้นและอาจทำให้โปรแกรมทำงานโดยไม่คาดคิด หากมีการดักจับข้อผิดพลาด ควรบันทึกข้อความข้อผิดพลาดหรือดำเนินการที่เหมาะสมอย่างน้อยที่สุด

6.5 การใช้ประโยชน์จากบล็อก finally

บล็อก finally ใช้สำหรับเขียนโค้ดที่ต้องทำงานเสมอ ไม่ว่าจะมีข้อผิดพลาดเกิดขึ้นหรือไม่ ตัวอย่างเช่น การปิดไฟล์ (Closing files) หรือการคืนค่าทรัพยากร (Releasing resources) ซึ่งเป็นสิ่งจำเป็นจะต้องเขียนไว้ในส่วนนี้

try:
    file = open("example.txt", "r")
    # โค้ดสำหรับอ่านไฟล์
except FileNotFoundError:
    print("ไม่พบไฟล์")
finally:
    file.close()

ในตัวอย่างนี้ แม้ว่าจะเปิดไฟล์ไม่สำเร็จ บล็อก finally ก็จะทำการปิดไฟล์อย่างแน่นอน

7. สรุป

การจัดการข้อผิดพลาดใน Python เป็นเทคนิคที่สำคัญที่ช่วยเพิ่มความน่าเชื่อถือของโปรแกรม และช่วยให้สามารถตอบสนองต่อข้อผิดพลาดได้อย่างเหมาะสม การใช้ try และ except เพื่อดักจับข้อผิดพลาด และการสร้างข้อผิดพลาดแบบกำหนดเองด้วย raise จะช่วยเพิ่มความยืดหยุ่นและความสามารถในการบำรุงรักษาของโค้ด

     

  • เราได้เรียนรู้ว่าข้อผิดพลาดคืออะไร และได้ทำความเข้าใจเกี่ยวกับประเภทของข้อผิดพลาดที่พบบ่อย
  •  

  • เราได้เรียนรู้วิธีการจัดการข้อผิดพลาดพื้นฐานโดยใช้ try และ except
  •  

  • เราได้เห็นวิธีการจัดการข้อผิดพลาดหลายรายการพร้อมกันในบล็อก except เดียว
  •  

  • เราได้เรียนรู้วิธีการสร้างข้อผิดพลาดโดยใช้คำสั่ง raise และการประยุกต์ใช้
  •  

  • เราได้เรียนรู้วิธีการดึงออบเจ็กต์ข้อผิดพลาดและรับข้อมูลรายละเอียดเกี่ยวกับข้อผิดพลาด
  •  

  • สุดท้าย เราได้พิจารณาแนวทางปฏิบัติที่ดีที่สุดในการจัดการข้อผิดพลาด และกล่าวถึงการออกแบบการจัดการข้อผิดพลาดที่มีประสิทธิภาพ

การจัดการข้อผิดพลาดเป็นเทคนิคที่ขาดไม่ได้ในการรับประกันความน่าเชื่อถือของโปรแกรม มาใช้เทคนิคเหล่านี้เพื่อพัฒนาแอปพลิเคชัน Python ที่แข็งแกร่งและเป็นมิตรกับผู้ใช้กันเถอะ

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール