Python – User-defined Exception

og:image

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’ ที่ใช้ในการระบุชื่อข้อมูลที่ส่งผลให้เกิดข้อผิดพลาด ซึ่งต่างกันไปตามรูปแบบการจัดการกับข้อผิดพลาดชนิดนั้นๆ ตามแผนภาพด้านล่าง


    สำหรับรายละเอียดของการสร้างคลาสต่างๆ นั้น มีขั้นตอนดังนี้

    1. สร้างคลาสหลักสำหรับจัดการกับข้อผิดพลาดที่เกิดจากการรับข้อมูลเข้ามาในในรูปแบบที่ไม่ถูกต้อง โดยคลาสนี้จะเป็นคลาสต้นแบบสำหรับให้คลาสอื่นๆ ที่เกี่ยวข้องกับการจัดการข้อผิดพลาดในกรณีที่ระบบได้รับข้อมูลอยู่ในรูปแบบที่ไม่ถูกต้อง ให้ได้สืบทอดและเพิ่มเติมคุณลักษะอื่นๆ ซึ่งคลาสต้นแบบนี้จะมีการกำหนดคุณลักษณะที่คลาสอื่นๆที่สืบทอดต้องมีร่วมกัน คือ ให้มีข้อความ ‘message’ สำหรับระบุรายละเอียดข้อผิดพลาด
      ตัวอย่างการใช้งาน: สร้างไฟล์ InvalidFormatError.py อยู่ภายในโฟลเดอร์ exceptions

      # -*- coding: utf-8 -*-
      
      # สร้างคลาสใหม่เพื่อจัดการกับข้อผิดพลาดในกรณีที่ข้อมูลที่ป้อนเข้ามามีรูปแบบไม่ถูกต้อง
      class InvalidFormatError(Exception):
      
       	# กำหนด constructor และทำการกำหนดข้อความสำหรับระบุ
       	# รายละเอียดของข้อผิดพลาด  
      	def __init__(self, *args, **kwargs):
      		self.message = "เกิดข้อผิดพลาด: ข้อมูลที่ถูกป้อนไม่อยู่ในรูปแบบที่ถูกต้อง"
      		super().__init__(*args, **kwargs)
      
      
    2. สร้างคลาสสำหรับจัดการกับข้อผิดพลาดที่จะแจ้งในกรณีที่ข้อมูลอีเมลล์(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
      
      
    3. สร้าง 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)' "\
      				"มีรูปแบบของข้อมูลไม่ถูกต้อง โดยชื่อผู้ใช้จะมีเพียงตัวอักษร, "\
      				"ตัวเลขและ '_' เท่านั้น กรุณากรอกข้อมูลใหม่."
      		
      
    4. สร้าง 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
      	
      
    5. ส่วนของตัวโปรแกรมที่ทำการขอรับข้อมูลชื่อผู้ใช้งาน(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’ สำหรับระบุรายละเอียดข้อผิดพลาด และ แต่ละคลาสก็จะมีคุณลักษณะเพิ่มเติมซึ่งต่างกันไปตามรูปแบบข้อผิดพลาด และข้อมูลที่จำเป็นสำหรับการแจ้งรายละเอียดข้อผิดพลาดนั้นๆ เพิ่มเติม

ที่มาของข้อมูล: https://www.programiz.com/python-programming/user-defined-exception
โปรแกรมสำหรับวาดแผนภาพ: draw.io
ข้อมูลเพิ่มเติมเกี่ยวกับ regular expression: https://docs.python.org/3/library/re.html