Python – User-defined Exception
สำหรับ python นั้น มี built-in exception ที่สร้างไว้ให้ใช้งานแล้วหลายชนิดตามที่กล่าวถึงไปในบทก่อนหน้านี้ เพื่อให้สามารถรองรับการเกิดข้อผิดพลาดในรูปแบบต่างๆ ที่สามารถเกิดขึ้นในโปรแกรม นอกจากข้อผิดพลาดในรูปแบบดังกล่าว เรายังสามารถที่จะกำหนดวิธีการรองรับข้อผิดพลาดชนิดใหม่ขึ้นเอง(user-defined exception) เพื่อจัดการข้อผิดพลาด หรือ ส่งข้อข้อมูลเฉพาะเจาะจงให้เหมาะสมตามรูปแบบข้อผิดพลาดนั้นได้อีกด้วย
วิธีการสร้างการรองรับข้อผิดพลาดชนิดใหม่ๆ ขึ้นมาใช้งานเองนั้น(user-defined exception) สามารถทำได้โดยการสร้างคลาสใหม่สำหรับข้อผิดพลาดนั้น โดยคลาสใหม่ทุกคลาสที่จัดการกับข้อผิดพลาดนี้จะต้องเป็นคลาสที่สืบทอดมาจากคลาส Exception อาจจะเป็นการสืบทอดโดยตรง หรือ สืบทอดต่อกันมาอีกทอด(derived) จากคลาสต้นแบบที่เป็น built-in exception
สำหรับคลาสที่เป็น built-in exception ทุกคลาสที่มีให้ใช้งาน ต่างเป็นเป็นคลาสที่สืบทอดมาจากคลาส Exception นี้เช่นเดียวกัน
-
รูปแบบการสร้าง user-defined exception ที่สืบทอดมาจากคลาส Exception โดยตรง
เราสามารถสร้าง user-defined exception ขึ้นมาใช้งานเอง โดยการสร้างคลาสขึ้นมาใหม่ และคลาสเหล่านี้จำเป็นต้องสืบทอดมาจากคลาส Exception โดยตรง หรือ คลาสอื่นๆ ที่สืบทอดมาจากคลาส Exception อีกทอดหนึ่งก็ได้ แล้วจึงทำการกำหนดรูปแบบการจัดการกับข้อผิดพลาดเพิ่มเติมให้เหมาะสมกับรูปแบบข้อผิดพลาดนั้นเอง
โดยในตัวอย่างนี้จะทำการสร้างคลาส InvalidFormatError ซึ่งสืบทอดมาจากคลาส Exception ดังแสดงในแผนภาพด้านล่าง โดยคลาสนี้จะทำการจัดการกับข้อผิดพลาดในกรณีรูปแบบของข้อมูลที่ป้อนเข้ามาไม่ถูกต้อง โดยการเพิ่มคุณลักษณะข้อความ(message) เพื่อระบุรายละเอียดของข้อผิดพลาด ให้กับคลาสดังกล่าว

ตัวอย่างการใช้งาน# -*- coding: utf-8 -*- # สร้างคลาสใหม่เพื่อจัดการกับข้อผิดพลาดในกรณีที่ข้อมูลที่ป้อนเข้ามามีรูปแบบไม่ถูกต้อง class InvalidFormatError(Exception): # กำหนด constructor และทำการกำหนดข้อความสำหรับระบุ # รายละเอียดของข้อผิดพลาด def __init__(self, *args, **kwargs): self.message = "เกิดข้อผิดพลาด: ข้อมูลที่ถูกป้อนไม่อยู่ในรูปแบบที่ถูกต้อง" super().__init__(*args, **kwargs) try: # ทำการกำหนดตัวอย่างข้อมูล input_value = 30 # ทำการตรวจสอบข้อมูล หากข้อมูลมีค่ามากกว่า 25 ให้แจ้งข้อผิดพลาด # โดยทำการระบุรายละเอียดข้อผิดพลาดเพิ่มเติมไปจากรายละเอียด # ที่กำหนดไว้ตอนสร้างคลาสดังกล่าว if input_value > 25 : raise InvalidFormatError("ข้อมูลที่ระบุจำเป็นต้องมีค่ามากกว่า 25") # กำหนดรูปแบบการจัดการเมื่อเกิดข้อผิดพลาดชนิด InvalidFormatError except InvalidFormatError as e: print(e.message) print(str(e)) # กำหนดรูปแบบการจัดการเมื่อเกิดข้อผิดพลาดอื่นๆ ทุกชนิดที่ไม่ได้เขียนคำสั่งรองรับไว้ except Exception as e: print(str(e)) # โปรแกรมทำการปรินต์ค่า # เกิดข้อผิดพลาด: ข้อมูลที่ถูกป้อนไม่อยู่ในรูปแบบที่ถูกต้อง # ข้อมูลที่ระบุจำเป็นต้องมีค่ามากกว่า 25จากตัวอย่าง ได้ทำการสร้าง user-defined exception ชนิดใหม่ขึ้นชื่อว่าคลาส InvalidFormatError ใช้สำหรับรองรับข้อผิดพลาดต่างๆ ที่อาจะเกิดจากการใส่ข้อมูลที่ไม่อยู่ในรูปแบบที่ถูกต้องตามเงื่อนไขที่โปรแกรมกำหนด โดยคลาสสำหรับรองรับข้อผิดพลาดที่สร้างขึ้นใหม่นี้จะสืบทอดคุณลักษณะ(derived) มาจากคลาส Exception โดยตรง และเราได้เพิ่มคำสั่งสำหรับการจัดข้อผิดพลาด โดยทำการกำหนดข้อความเพิ่มเติมสำหรับระบุรายละเอียดของข้อผิดพลาดลงไปในคลาสดังกล่าว เมื่อต้องการเรียกใช้งานข้อผิดพลาดนี้ เราก็สามารถเขียนคำสั่งเพื่อระบุข้อผิดพลาดชนิดนี้ ได้จากคำสั่ง raise โดยสามารถที่จะระบุข้อความเพื่อเพิ่มรายละเอียดหรือไม่ระบุก็ได้ เช่นเดียวกับการใช้งาน exception ชนิดอื่นๆ
-
รูปแบบการสร้าง user-defined exception ที่สืบทอดมาจากคลาสอื่นอีกทอดหนึ่ง
หากเราทำการพัฒนาโปรเจคที่มีขนาดใหญ่ เราอาจทำการสร้าง user-defined exception ออกมาหลายชนิดเพื่อรองรับรูปแบบข้อผิดพลาดที่อาจเกิดขึ้นได้ในระหว่างการดำเนินการของโปรแกรม โดยข้อผิดพลาดหลายๆชนิดที่สร้างขึ้น ก็อาจจะมีคุณลักษณะร่วมที่เหมือนๆ กันระหว่างแต่คลาส และอาจมีบางคุณลักษณะพิเศษบางอย่างที่แตกต่างกันไปในแต่ละคลาส หากเป็นเช่นนี้ เราสามารถทำการกำหนดคลาสต้นแบบเพื่อกำหนดรูปแบบที่มีร่วมกันในการจัดการข้อผิดพลาด แล้วสร้างคลาสอื่นๆ ที่สืบทอดมาจากคลาสหลักนี้อีกทอดหนึ่ง เพื่อให้คลาสเหล่านั้นมีคุณลักษณะบางอย่างร่วมกัน แต่ก็สามารถเพิ่มคุณลักษณะอื่นๆ เข้าไปในคลาสที่สืบทอดได้เพิ่มเติมอีกด้วย
นอกจากนี้ เราอาจจะต้องทำการแยกคลาสที่สร้างขึ้นใหม่ไว้เฉพาะในแต่ละไฟล์ โดย 1 ไฟล์ก็สำหรับ exception ใหม่ 1 คลาส เพื่อให้ง่ายต่อการจัดการ, ค้นหา, การแก้ไขหรือเรียกใช้ในอนาคต แต่รูปแบบการจัดการไฟล์เหล่านี้ก็อาจจะแตกต่างกันขึ้นอยู่กับความถนัดและความเหมาะสมของผู้พัฒนาแต่ละคน
โดยตัวอย่างนี้จะทำการสร้างคลาสสำหรับจัดการกับข้อผิดพลาดต่างๆ ที่อาจเกิดขึ้นได้จากการป้อนข้อมูลในรูปแบบที่ไม่ถูกต้อง ในรูปแบบที่แตกต่างกัน ซึ่งประกอบด้วย
- EmailFormatError: มีหน้าที่จัดการกับข้อผิดพลาดในกรณีรูปแบบของข้อมูลอีเมลล์(email) ไม่ถูกต้อง
- UsernameFormatError: มีหน้าที่จัดการกับข้อผิดพลาดในกรณีที่รูปแบบของข้อมูลชื่อผู้ใช้งาน(username) ไม่ถูกต้อง
- EmptyFieldError: มีหน้าที่จัดการกับข้อผิดพลาดในกรณีที่ผู้ใช้ไม่ได้ทำการกรอกข้อมูลนั้นๆ
ซึ่งทั้ง 3 คลาสข้างต้นนั้น ต่างสืบทอดมาจากคลาส InvalidFormatError ซึ่งเป็นคลาสต้นแบบอีกทอดหนึ่ง โดยทั้ง 3 คลาส จะมีคุณลักษณะร่วมกันคือ มีคุณลักษณะข้อความ ‘message’ สำหรับระบุรายละเอียดของข้อผิดพลาด และแต่ละคลาสนั้นก็จะมีคุณลักษณะเพิ่มเติมที่แตกต่างกันไป เช่น คุณลักษณะค่าข้อมูล ‘value’ ซึ่งจะใช้ระบุข้อมูลที่ส่งผลให้เกิดข้อผิดพลาด หรือคุณลักษณะชื่อข้อมูล ‘field_name’ ที่ใช้ในการระบุชื่อข้อมูลที่ส่งผลให้เกิดข้อผิดพลาด ซึ่งต่างกันไปตามรูปแบบการจัดการกับข้อผิดพลาดชนิดนั้นๆ ตามแผนภาพด้านล่าง

สำหรับรายละเอียดของการสร้างคลาสต่างๆ นั้น มีขั้นตอนดังนี้
-
สร้างคลาสหลักสำหรับจัดการกับข้อผิดพลาดที่เกิดจากการรับข้อมูลเข้ามาในในรูปแบบที่ไม่ถูกต้อง โดยคลาสนี้จะเป็นคลาสต้นแบบสำหรับให้คลาสอื่นๆ ที่เกี่ยวข้องกับการจัดการข้อผิดพลาดในกรณีที่ระบบได้รับข้อมูลอยู่ในรูปแบบที่ไม่ถูกต้อง ให้ได้สืบทอดและเพิ่มเติมคุณลักษะอื่นๆ ซึ่งคลาสต้นแบบนี้จะมีการกำหนดคุณลักษณะที่คลาสอื่นๆที่สืบทอดต้องมีร่วมกัน คือ ให้มีข้อความ ‘message’ สำหรับระบุรายละเอียดข้อผิดพลาด
ตัวอย่างการใช้งาน: สร้างไฟล์ InvalidFormatError.py อยู่ภายในโฟลเดอร์ exceptions# -*- coding: utf-8 -*- # สร้างคลาสใหม่เพื่อจัดการกับข้อผิดพลาดในกรณีที่ข้อมูลที่ป้อนเข้ามามีรูปแบบไม่ถูกต้อง class InvalidFormatError(Exception): # กำหนด constructor และทำการกำหนดข้อความสำหรับระบุ # รายละเอียดของข้อผิดพลาด def __init__(self, *args, **kwargs): self.message = "เกิดข้อผิดพลาด: ข้อมูลที่ถูกป้อนไม่อยู่ในรูปแบบที่ถูกต้อง" super().__init__(*args, **kwargs)
-
สร้างคลาสสำหรับจัดการกับข้อผิดพลาดที่จะแจ้งในกรณีที่ข้อมูลอีเมลล์(email)ที่ระบุเป็นข้อมูลในรูปแบบที่ไม่ถูกต้อง โดยคลาสนี้จะเป็นคลาสที่สืบทอดมาจากคลาส InvalidFormatError สำหรับการจัดการข้อผิดพลาดในกรณีที่ข้อมูลอีเมลล์(email) ที่ได้รับอยู่ในรูปแบบที่ไม่ถูกต้อง โดยจะมีคุุณลักษณะที่สืบทอดมา คือ ข้อความ ‘message’ สำหรับระบุรายละเอียดข้อผิดพลาด และมีคุณลักษณะเพิ่มเติมคือ มีการระบุค่าข้อมูล ‘value’ ที่ทำให้เกิดข้อผิดพลาดดังกล่าวด้วย
ตัวอย่างการใช้งาน: สร้างไฟล์ EmailFormatError.py อยู่ภายในโฟลเดอร์ exceptions# -*- coding: utf-8 -*- # ทำการนำเข้าคลาส InvalidFormatError ซึ่งเป็นคลาสต้นแบบของการ # กำหนดรูปแบบการจัดการข้อผิดพลาดในกรณีที่ข้อมูลอยู่ในรูปแบบที่ไม่ถูกต้อง from .InvalidFormatError import InvalidFormatError # สร้างคลาสใหม่เพื่อจัดการกับข้อผิดพลาดในกรณีที่ข้อมูลอีเมลล์(email) ที่ป้อนเข้ามา # อยู่ในรูปแบบไม่ถูกต้อง class EmailFormatError(InvalidFormatError): def __init__(self, value): self.message = "เกิดข้อผิดพลาด: ข้อมูล 'อีเมลล์(email)' มีรูปแบบของข้อมูลไม่ถูกต้อง "\ "กรุณากรอกข้อมูลใหม่" self.value = value
-
สร้าง class สำหรับจัดการกับข้อผิดพลาดที่จะแจ้งในกรณีที่ข้อมูลชื่อผู้ใช้งาน(username)ที่ระบุให้เป็นข้อมูลในรูปแบบที่ไม่ถูกต้อง โดยคลาสนี้จะเป็นคลาสที่สืบทอดมาจากคลาส InvalidFormatError สำหรับการจัดการข้อผิดพลาดในกรณีที่ข้อมูลชื่อผู้ใช้งาน(username) ที่ได้รับอยู่ในรูปแบบที่ไม่ถูกต้อง โดยจะมีคุุณลักษณะที่สืบทอดมา คือ ข้อความ ‘message’ สำหรับระบุรายละเอียดข้อผิดพลาด และมีคุณลักษณะเพิ่มเติมคือ มีการระบุค่าข้อมูล ‘value’ ที่ทำให้เกิดข้อผิดพลาดดังกล่าวด้วย
ตัวอย่างการใช้งาน: สร้างไฟล์ UsernameFormatError.py อยู่ภายในโฟลเดอร์ exceptions# -*- coding: utf-8 -*- # ทำการนำเข้าคลาส InvalidFormatError ซึ่งเป็นคลาสต้นแบบของการ # กำหนดรูปแบบการจัดการข้อผิดพลาดในกรณีที่ข้อมูลอยู่ในรูปแบบที่ไม่ถูกต้อง from .InvalidFormatError import InvalidFormatError # สร้างคลาสใหม่เพื่อจัดการกับข้อผิดพลาดในกรณีที่ข้อมูลชื่อผู้ใช้งาน(username) # ที่ป้อนเข้ามาอยู่ในรูปแบบไม่ถูกต้อง class UsernameFormatError(InvalidFormatError): def __init__(self, value): self.message = "เกิดข้อผิดพลาด: ข้อมูล 'ชื่อผู้ใช้งาน(username)' "\ "มีรูปแบบของข้อมูลไม่ถูกต้อง โดยชื่อผู้ใช้จะมีเพียงตัวอักษร, "\ "ตัวเลขและ '_' เท่านั้น กรุณากรอกข้อมูลใหม่."
-
สร้าง class สำหรับจัดการกับข้อผิดพลาดที่จะแจ้งในกรณีที่ไม่มีการใส่ข้อมูลที่ระบบร้องขอ โดยคลาสนี้จะเป็นคลาสที่สืบทอดมาจากคลาส InvalidFormatError สำหรับการจัดการข้อผิดพลาดในกรณีที่ผู้ใช้ไม่ได้ทำการระบุข้อมูลที่ระบบร้องขอ โดยจะมีคุุณลักษณะที่สืบทอดมา คือ ข้อความ ‘message’ สำหรับระบุรายละเอียดข้อผิดพลาด และมีคุณลักษณะเพิ่มเติมคือ มีการระบุชนิดของข้อมูล ‘field_name’ ที่ผู้ใช้ไม่ได้ทำการป้อนข้อมูลให้ระบบ ซึ่งเป็นสาเหตุทำให้เกิดข้อผิดพลาดดังกล่าวด้วย
ตัวอย่างการใช้งาน: สร้างไฟล์ EmptyFieldError.py อยู่ภายในโฟลเดอร์ exceptions# -*- coding: utf-8 -*- # ทำการนำเข้าคลาส InvalidFormatError ซึ่งเป็นคลาสต้นแบบของการ # กำหนดรูปแบบการจัดการข้อผิดพลาดในกรณีที่ข้อมูลอยู่ในรูปแบบที่ไม่ถูกต้อง from .InvalidFormatError import InvalidFormatError # สร้างคลาสใหม่เพื่อจัดการกับข้อผิดพลาดในกรณีที่ไม่ได้ทำการระบุข้อมูลให้ครบถ้วน class EmptyFieldError(InvalidFormatError): def __init__(self, field_name): self.message = "เกิดข้อผิดพลาด: กรุณาทำการระบุข้อมูลให้ครบถ้วน" self.field_name = field_name
-
ส่วนของตัวโปรแกรมที่ทำการขอรับข้อมูลชื่อผู้ใช้งาน(username), รหัสผ่าน(password) และอีเมลล์(email) จากผู้ใช้งาน โดยเมื่อรันโปรแกรม จะมีการขอรับข้อมูลแต่ละชนิดเข้ามาในระบบ เมื่อรับข้อมูลเข้ามาแล้วก็จะทำการตรวจสอบข้อมูลแต่ละชนิดว่าอยู่ในรูปแบบที่ถูกต้องหรือไม่ หากพบข้อมูลที่อยู่ในรูปแบบที่ไม่ถูกต้องก็จะเรียกใช้งาน user-defined exception ที่สร้างไว้แล้วในข้างต้น เพื่อแจ้งข้อผิดพลาดในรูปแบบที่เหมาะสมกับข้อผิดพลาดนั้น แล้วจึงขอรับข้อมูลใหม่ จนกว่าข้อมูลจะอยู่ในรูปแบบที่ถูกต้อง
ตัวอย่างการใช้งาน: สร้างไฟล์ example.py อยู่ภายนอกโฟลเดอร์ exceptions# -*- coding: utf-8 -*- # ทำการนำเข้าคลาส EmailFormatError ซึ่งเป็นคลาสสำหรับจัดการกับข้อผิดพลาด # เมื่อข้อมูลอีเมลล์(email) อยู่ในรูปแบบที่ไม่ถูกต้อง from exceptions.EmailFormatError import EmailFormatError # ทำการนำเข้าคลาส UsernameFormatError ซึ่งเป็นคลาสสำหรับจัดการกับข้อผิดพลาด # เมื่อข้อมูลชื่อผู้ใช้งาน(username) อยู่ในรูปแบบที่ไม่ถูกต้อง from exceptions.UsernameFormatError import UsernameFormatError # ทำการนำเข้าคลาส EmptyFieldError ซึ่งเป็นคลาสสำหรับจัดการกับข้อผิดพลาด # เมื่อทำการระบุข้อมูลไม่ครบถ้วน from exceptions.EmptyFieldError import EmptyFieldError # นำเข้าไลบรารี่ re เพื่อใช้งาน regular expression import re # กำหนดรูปแบบของ regular expression ที่ใช้ระบุรูปแบบของข้อมูล # ชื่อผู้ใช้งาน(username) ที่สามารถใช้ได้ภายในระบบ ซึ่งสามารถประกอบด้วย # ตัวอักษรภาษาอังกฤษ, ตัวเลข หรือ เครื่องหมาย(_) เท่านั้น regex_username_pattern = r"[a-zA-Z0-9\_]+" # กำหนดรูปแบบของ regular expression ที่ใช้ระบุรูปแบบของข้อมูล # อีเมลล์(email) ที่สามารถใช้ได้ภายในระบบ ซึ่งต้องอยู่ในรูปแบบ # <username>@<hostname>.<extension> regex_email_pattern = r"[a-zA-Z0-9\_]+@[a-zA-Z0-9\_]+\.[a-zA-Z]+" # สร้างฟังก์ชันสำหรับตรวจสอบข้อมูลว่า ได้มีทำการใส่ข้อมูลเข้ามาหรือไม่ def validate_empty_data(input_data): if(input_data is not None and len(input_data)>0): return True return False # สร้างฟังก์ชันสำหรับทำการตรวจสอบรูปแบบของข้อมูลอีเมลล์(email) ว่าอยู่ในรูปแบบ # ที่ถูกต้องหรือไม่ def validate_email(input_email): email_pattern = re.compile( regex_email_pattern ) is_email_valid = email_pattern.fullmatch(input_email) if(is_email_valid is not None) : return True return False # สร้างฟังก์ชันสำหรับทำการตรวจสอบรูปแบบของข้อมูลชื่อผู้ใช้งาน(username) # ว่าอยู่ในรูปแบบที่ถูกต้องหรือไม่ def validate_username(input_username): username_pattern = re.compile( regex_username_pattern ) is_username_valid = username_pattern.fullmatch(input_username) if(is_username_valid is not None) : return True return False # กำหนดตัวแปรแต่ละตัว สำหรับตรวจสอบว่าข้อมูลชนิดดังกล่าวถูกป้อนเข้ามา # ในรูปแบบที่ถูกต้องหรือไม่ หากข้อมูลยังไม่อยู่ในรูปแบบที่ถูกต้อง ระบบจำเป็น # จะต้องขอข้อมูลใหม่ is_username_ready = False is_password_ready = False is_email_ready = False # ทำการวนลูปเพื่อขอรับข้อมูลไปเรื่อยๆ จนกว่าระบบจะได้รับข้อมูลชื่อผู้ใช้งาน(username), # รหัสผ่าน(password) และอีเมลล์(email) ในรูปแบบที่ถูกต้อง while True: try: # ทำการตรวจสอบว่า ระบบได้รับข้อมูลของชื่อผู้ใช้งาน(username) # ในรูปแบบที่ถูกต้องแล้วหรือไม่ หากข้อมูลยังอยู่ในรูปแบบที่ไม่ถูกต้อง # ระบบจำเป็นต้องขอข้อมูลดังกล่าวใหม่ if is_username_ready == False: # ระบบร้องขอให้กรอกข้อมูลชื่อผู้ใช้งาน(username) input_username = input("กรุณากรอกข้อมูลชื่อผู้ใช้งาน(username): ") # ทำการตรวจสอบว่าผู้ใช้งานกรอกข้อมูลเข้ามาหรือไม่ # หากไม่ได้กรอกข้อมูล ระบบจะแจ้งข้อผิดพลาด # และจำเป็นต้องร้องขอข้อมูลใหม่ if validate_empty_data(input_username) == False : # ทำการแจ้งข้อผิดพลาดในรูปแบบ EmptyFieldError พร้อมทั้งระบุชื่อข้อมูลที่ไม่ได้ทำการกรอกข้อมูล raise EmptyFieldError("username") # ทำการตรวจสอบว่าผู้ใช้งานกรอกข้อมูลชื่อผู้ใช้งาน(username) # ในรูปแบบที่ถูกต้องหรือไม่ หากข้อมูลอยู่ในรูปแบบ # ที่ไม่ถูกต้องระบบจะแจ้งข้อผิดพลาด และจำเป็นต้อง # ร้องขอข้อมูลใหม่ elif validate_username(input_username) == False: # ทำการแจ้งข้อผิดพลาดในรูปแบบ UsernameFormatError # พร้อมทั้งระบุข้อมูลที่ผิดพลาด raise UsernameFormatError(input_username) else: is_username_ready = True # ทำการตรวจสอบว่า ระบบได้รับข้อมูลรหัสผ่าน(password) # ในรูปแบบที่ถูกต้องแล้วหรือไม่ หากข้อมูลยังอยู่ในรูปแบบที่ไม่ถูกต้อง # ระบบจำเป็นต้องขอข้อมูลดังกล่าวใหม่ if is_password_ready == False: # ระบบร้องขอให้กรอกข้อมูลรหัสผ่าน(password) input_password = input("กรุณากรอกข้อมูลรหัสผ่าน(password) : ") # ทำการตรวจสอบว่าผู้ใช้งานกรอกข้อมูลเข้ามาหรือไม่ # หากไม่ได้กรอกข้อมูล ระบบจะแจ้งข้อผิดพลาด # และจำเป็นต้องร้องขอข้อมูลใหม่ if validate_empty_data(input_password) == False: # ทำการแจ้งข้อผิดพลาดในรูปแบบ EmptyFieldError พร้อมทั้งระบุ # ชื่อข้อมูลที่ไม่ได้ทำการกรอกข้อมูล raise EmptyFieldError("password") else: is_password_ready = True # ทำการตรวจสอบว่า ระบบได้รับข้อมูลอีเมลล์(email) # ในรูปแบบที่ถูกต้องแล้วหรือไม่ หากข้อมูลยังอยู่ในรูปแบบที่ไม่ถูกต้อง # ระบบจำเป็นต้องขอข้อมูลดังกล่าวใหม่ if is_email_ready == False: # ระบบร้องขอให้กรอกข้อมูลอีเมลล์(email) input_email = input("กรุณากรอกข้อมูลอีเมลล์(email): ") # ทำการตรวจสอบว่าผู้ใช้งานกรอกข้อมูลเข้ามาหรือไม่ # หากไม่ได้กรอกข้อมูล ระบบจะแจ้งข้อผิดพลาด # และจำเป็นต้องร้องขอข้อมูลใหม่ if validate_empty_data(input_username) == False : # ทำการแจ้งข้อผิดพลาดในรูปแบบ EmptyFieldError พร้อมทั้งระบุ # ชื่อข้อมูลที่ไม่ได้ทำการกรอกข้อมูล raise EmptyFieldError("username") # ทำการตรวจสอบว่าผู้ใช้งานกรอกข้อมูลอีเมลล์(email) # เข้ามาในรูปแบบที่ถูกต้องหรือไม่ หากข้อมูลอยู่ในรูปแบบ # ที่ไม่ถูกต้องระบบจะแจ้งข้อผิดพลาด # และจำเป็นต้องร้องขอข้อมูลใหม่ elif validate_email(input_email) == False: # ทำการแจ้งข้อผิดพลาดในรูปแบบ EmailFormatError พร้อมทั้ง # ระบุข้อมูลที่ผิดพลาด raise EmailFormatError(input_email) else: is_email_ready = True break # จัดการข้อผิดพลาดในรูปแบบ EmailFormatError เมื่อข้อมูลอีเมลล์ไม่อยู่ใน # รูปแบบที่ถูกต้อง โดยทำการปรินต์ 'รายละเอียดข้อผิดพลาด'และ 'ค่าข้อมูล' # ที่ทำให้เกิดข้อผิดพลาดดังกล่าว except EmailFormatError as e: print(e.message) print("check format of input email: "+ e.value) # จัดการข้อผิดพลาดในรูปแบบ UsernameFormatError เมื่อข้อมูลอีเมลล์ # ไม่อยู่ในรูปแบบที่ถูกต้อง โดยทำการปรินต์ 'รายละเอียดข้อผิดพลาด' และ # 'ชื่อข้อมูล' ที่ทำให้เกิดข้อผิดพลาดดังกล่าว except UsernameFormatError as e: print(e.message) print("check format of input username: "+ e.value) # จัดการข้อผิดพลาดในรูปแบบ EmptyFieldError เมื่อไม่ได้ทำการกรอกข้อมูล # ตามที่ระบบร้องขอ โดยทำการปรินต์ 'รายละเอียดข้อผิดพลาด' และ # 'ชื่อข้อมูล' ที่ทำให้เกิดข้อผิดพลาดดังกล่าว except EmptyFieldError as e: print(e.message) print("check input data of field '"+ e.field_name + "'") # จัดการข้อผิดพลาดที่อาจะเกิดขึ้นในโปรแกรมในรูปแบบอื่นๆ ทั้งหมด # นอกเหนือจากที่เขียนคำสั่งระบุไว้ except Exception as e: print(str(e))จากตัวอย่าง โปรแกรมขอรับข้อมูลชื่อผู้ใช้งาน(username), รหัสผ่าน(password) และอีเมลล์(email) จากผู้ใช้ เมื่อได้รับข้อมูลแต่ละชนิดแล้ว โปรแกรมก็จะทำการตรวจสอบข้อมูลดังกล่าวว่าเป็นข้อมูลที่อยู่ในรูปแบบที่ถูกต้องหรือไม่ โดยขั้นตอนการตรวจสอบข้อมูลนั้นเราจะนำข้อมูลที่ผู้ใช้ป้อนเข้ามาให้ระบบแล้วทำการตรวจสอบด้วย regular expresson เพื่อตรวจสอบว่าข้อมูลนั้นมีรูปแบบข้อมูลตามข้อจำกัดของระบบหรือไม่ เช่น สำหรับข้อมูลชื่อผู้ใช้งาน(username)สามารถจะประกอบด้วยตัวเลข, ตัวอักษรและเครื่องหมาย(_) เท่านั้น ส่วนข้อมูลอีเมลล์(email)จะต้องอยู่ในรูปแบบ <username>@<hostname>.<extension> เมื่อทำการตรวจสอบข้อมูลแล้วหากข้อมูลยังอยู่ในรูปแบบที่ไม่ถูกต้อง โปรแกรมจะทำการแจ้งรายละเอียดข้อผิดพลาด และขอรับข้อมูลเหล่านั้นใหม่ จนกว่าข้อมูลทั้งหมดจะอยู่ในรูปแบบที่ถูกต้อง
ซึ่งเราได้ทำการสร้างคลาสต้นแบบชื่อว่า InvalidFormatError เพื่อเป็นคลาสหลักสำหรับการจัดการข้อผิดพลาดเนื่องจากรูปแบบข้อมูลไม่ถูกต้อง แล้วสร้างคลาสสำหรับจัดการข้อผิดพลาดอื่นๆ ที่สืบทอดมาจากคลาสต้นแบบดังกล่าว เช่น EmailFormatError, UsernameFormatError, EmailFormatError โดยทั้ง 3 คลาสที่สืบทอดมาจากคลาสต้นแบบ จะมีคุณลักษณะร่วมกันคือมี ข้อความ ‘message’ สำหรับระบุรายละเอียดข้อผิดพลาด และ แต่ละคลาสก็จะมีคุณลักษณะเพิ่มเติมซึ่งต่างกันไปตามรูปแบบข้อผิดพลาด และข้อมูลที่จำเป็นสำหรับการแจ้งรายละเอียดข้อผิดพลาดนั้นๆ เพิ่มเติม
โปรแกรมสำหรับวาดแผนภาพ: draw.io
ข้อมูลเพิ่มเติมเกี่ยวกับ regular expression: https://docs.python.org/3/library/re.html
