Trước khi đi vào tìm hiểu bài học này, bạn nên đọc xong bài Xử lý ngoại lệ trong Python để nắm được những điều cơ bản về ngoại lệ trong Python.

Python có thể ném ra các errors (lỗi) và exceptions (ngoại lệ), khi có một đoạn code nào đó bị lỗi, làm cho chương trình dừng động ngột. Python cũng cung cấp phương thức xử lý exception với sự trợ giúp của khối lệnh try-except. Có thể kể đến một số standard exceptions (ngoại lệ tiêu chuẩn) thường gặp nhất là: IndexError, ImportError, IOError, ZeroDivisionError, TypeError và FileNotFoundError. Người dùng có thể tạo ra một cái error của riêng mình bằng cách sử dụng class Exception.

1. Tạo ra ngoại lệ do người dùng tự định nghĩa

Các lập trình viên có thể đặt tên cho những exceptions của riêng họ bằng cách tạo ra một class exception mới. Các exceptions (ngoại lệ) đều cần phải được kế thừa trực tiếp hoặc gián tiếp từ class Exception. Mặc dù không phải là bắt buộc, nhưng hầu hết các exceptions đều được đặt tên với phần cuối là từ “Error”, tương tự như cách đặt tên cho các standard exceptions (ngoại lệ tiêu chuẩn) trong Python. Ví dụ, đoạn code dưới đây sẽ tạo ra một user-defined exception (ngoại lệ do người dùng tự định nghĩa):

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

# A python program to create user-defined exception 
  
# class MyError is derived from super class Exception 
class MyError(Exception): 
  
    # Constructor or Initializer 
    def __init__(self, value): 
        self.value = value 
  
    # __str__ is to print() the value 
    def __str__(self): 
        return(repr(self.value)) 
  
try: 
    raise(MyError(3*2)) 
  
# Value of Exception is stored in error 
except MyError as error: 
    print('A New Exception occured: ',error.value) 

Kết quả in ra là:

('A New Exception occured: ', 6)

2. Tìm hiểu các thông tin về class Exception

Để có thể đọc và biết được các thông tin về class Exception, bạn hãy chạy thử đoạn code sau:

help(Exception)

3. Dẫn xuất ra các Errors mới tử super class Exception

Super class Exception (lớp cha Exception) được tạo ra khi một module cần xử lý một vài errors (lỗi) riêng biệt. Một trong những cách phổ biến để làm điều này đó là tạo ra một base class (lớp cơ sở/lớp cha) để định nghĩa ra các exceptions dành cho module đó. Ngoài ra, chúng ta có thể định nghĩa ra rất nhiều các subclasses khác (lớp con khác) để tạo ra các exception classes đặc thù (các lớp ngoại lệ đặc thù) dành cho các error conditions – điều kiện lỗi khác nhau.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

# class Error is derived from super class Exception 
class Error(Exception): 
  
    # Error is derived class for Exception, but 
    # Base class for exceptions in this module 
    pass
  
class TransitionError(Error): 
  
    # Raised when an operation attempts a state  
    # transition that's not allowed. 
    def __init__(self, prev, nex, msg): 
        self.prev = prev 
        self.next = nex 
  
        # Error message thrown is saved in msg 
        self.msg = msg 
try: 
    raise(TransitionError(2,3*2,"Not Allowed")) 
  
# Value of Exception is stored in error 
except TransitionError as error: 
    print('Exception occured: ',error.msg) 

Kết quả in ra là:

('Exception occured: ', 'Not Allowed')

4. Làm thế nào để sử dụng được lớp Exception tiêu chuẩn như một baseclass?

Runtime error là một lớp ngoại lệ tiêu chuẩn (standard exception class), được đưa ra khi chương trình xuất hiện một lỗi mà không thuộc bất kỳ danh mục lỗi đã được định nghĩa sẵn nào của Python. Đoạn chương trình ví dụ sau đây sẽ minh họa cách để sử dụng class Runtime error làm base class (lớp cha) và sử dụng class Network error làm dervied class (lớp con/lớp kế thừa/lớp dẫn xuất). Theo cách tương tự thì bất kỳ exception (ngoại lệ) nào cũng đều có thể được dẫn xuất/kế thừa từ các standard exceptions (ngoại lệ tiêu chuẩn) của Python.


# NetworkError has base RuntimeError 
# and not Exception 
class Networkerror(RuntimeError): 
    def __init__(self, arg): 
        self.args = arg 
  
try: 
    raise Networkerror("Error") 
  
except Networkerror as e: 
    print (e.args) 

Kết quả in ra là:

('E', 'r', 'r', 'o', 'r')

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!