User-Defined Exceptions là các exception do người dùng tự định nghĩa, giúp xử lý lỗi trong Python theo cách rõ ràng và có tổ chức hơn. Thay vì sử dụng các exception có sẵn như ValueError hay TypeError, bạn có thể tạo riêng các exception phù hợp với logic chương trình. Trong bài viết này, mình sẽ hướng dẫn bạn cách tạo, kích hoạt (raise) và xử lý (handle) User-Defined Exceptions một cách bài bản. Ngoài ra, bạn cũng sẽ tìm hiểu cách cải thiện thông báo lỗi và bắt nhiều loại exception trong một khối try-except.
Điểm chính cần nắm
- User-Defined Exceptions trong Python là gì?: Là các exception do người dùng tự định nghĩa để xử lý lỗi cụ thể trong chương trình.
- Tại sao nên sử dụng User-Defined Exceptions?: Giúp mô tả lỗi chi tiết hơn, tăng tính rõ ràng và dễ bảo trì cho code.
- Cách tạo một User-Defined Exception: Gồm ba bước chính: định nghĩa class exception, khởi tạo thông tin chi tiết, và tùy chọn ghi đè method hiển thị lỗi.
- Bước 1: Định nghĩa class exception: Tạo class kế thừa từ
Exception
để xác định loại lỗi riêng. - Bước 2: Khởi tạo exception với thông tin chi tiết: Dùng
__init__
để truyền thông tin mô tả lỗi. - (Tùy chọn) Bước 3: Ghi đè bằng method str hoặc repr: Giúp hiển thị thông tin lỗi dễ hiểu hơn khi in ra.
- Bước 1: Định nghĩa class exception: Tạo class kế thừa từ
- Cách raise User-Defined Exception: Sử dụng
raise
để kích hoạt exception khi gặp điều kiện lỗi. - Cách handle User-Defined Exception: Dùng
try-except
để bắt và xử lý lỗi một cách an toàn. - Ví dụ hoàn chỉnh về User-Defined Exception: Minh họa cách tạo, raise và handle exception trong chương trình thực tế.
- Handle exception với nhiều except: Bắt nhiều loại lỗi khác nhau trong cùng một khối
try-except
. - Sử dụng finally để cleanup: Đảm bảo tài nguyên luôn được giải phóng dù có xảy ra lỗi hay không.
- Handle exception với nhiều except: Bắt nhiều loại lỗi khác nhau trong cùng một khối
- FAQ: Tổng hợp các câu hỏi thường gặp về User-Defined Exceptions trong Python.
- Vietnix – Giải pháp lưu trữ tốc độ cao, bảo mật và ổn định: Nhà cung cấp server, hosting và VPS đáng tin cậy, hỗ trợ kỹ thuật 24/7.
User-Defined Exceptions trong Python là gì?
User-Defined Exceptions trong Python là các exception do người dùng tự định nghĩa bằng cách tạo một class kế thừa từ Exception
hoặc một subclass của nó. Những exception này giúp xử lý các tình huống lỗi cụ thể trong chương trình một cách rõ ràng và có tổ chức hơn.

Tại sao nên sử dụng User-Defined Exceptions?
User-Defined Exceptions giúp quản lý lỗi hiệu quả và tổ chức hơn, tránh dùng các exception chung chung như ValueError
hay TypeError
. Dưới đây là một số lý do quan trọng:
- Clarity (Rõ ràng hơn): Giúp tạo ra thông báo lỗi cụ thể, dễ hiểu, thay vì sử dụng các exception chung chung như
ValueError
hayTypeError
. - Granularity (Chi tiết hơn): Cho phép phân loại và xử lý từng loại lỗi riêng biệt thay vì gom chung vào một exception tổng quát.
- Maintainability (Dễ bảo trì): Giúp tập trung logic xử lý lỗi, làm code dễ đọc và bảo trì hơn.
- Kiểm soát tốt hơn: Cho phép bạn đưa ra các hành động xử lý lỗi phù hợp với từng tình huống trong chương trình.
Nhờ User-Defined Exceptions, chương trình có thể vận hành một cách có tổ chức và dễ debug hơn khi gặp lỗi.
Cách tạo một User-Defined Exception
Để tạo một User-Defined Exception trong Python, bạn cần làm theo các bước sau:
Bước 1: Định nghĩa class exception
Tạo một class kế thừa từ Exception
hoặc một subclass bất kỳ phù hợp khác. Lớp mới này sẽ đóng vai trò là ngoại lệ tùy chỉnh của bạn.
class MyCustomError(Exception):
pass
Giải thích:
- Kế thừa: Bằng cách kế thừa từ lớp “Exception”, custom exception có đầy đủ hành vi của exception mặc định trong Python. Exception của bạn sẽ có cùng hành vi và thuộc tính như các ngoại lệ tích hợp sẵn.
- Định nghĩa lớp: Dùng cú pháp chuẩn của Python để tạo class. Nếu không cần xử lý đặc biệt, bạn có thể sử dụng
pass
để giữ class trống.
Bước 2: Khởi tạo exception với thông tin chi tiết
Triển khai phương thức “__init__” để khởi tạo bất kỳ thuộc tính nào hoặc cung cấp thông báo lỗi tùy chỉnh. Điều này cho phép bạn truyền thông tin cụ thể về lỗi để giúp việc debug dễ dàng hơn.
class InvalidAgeError(Exception):
def __init__(self, age, message="Age must be between 18 and 100"):
self.age = age
self.message = message
super().__init__(self.message)
Giải thích:
- Thuộc tính:
age
vàmessage
giúp lưu thông tin về lỗi.
- Khởi tạo: Phương thức “__init__” khởi tạo các thuộc tính này. Lệnh “super().__init__(self.message)” đảm bảo rằng lớp cơ sở “Exception” được khởi tạo đúng cách với thông báo lỗi.
- Thông báo mặc định: Một thông báo mặc định được cung cấp, nhưng bạn có thể ghi đè nó khi tạo ra ngoại lệ.
(Tùy chọn) Bước 3: Ghi đè bằng method __str__
hoặc __repr__
Ghi đè phương thức “__str__” hoặc “__repr__” để hiển thị lỗi một cách trực quan hơn khi exception được in ra.
class InvalidAgeError(Exception):
def __init__(self, age, message="Age must be between 18 and 100"):
self.age = age
self.message = message
super().__init__(self.message)
def __str__(self):
return f"{self.message}. Provided age: {self.age}"
Giải thích:
- Phương thức __str__: Phương thức “str” trả về một biểu diễn chuỗi của ngoại lệ; giúp exception có nội dung dễ đọc hơn khi in ra.
- Thông báo tùy chỉnh: Tùy chỉnh thông báo để bao gồm thông tin liên quan, chẳng hạn như giá trị
age
không hợp lệ.
Cách raise User-Defined Exception
Sau khi tạo một User-Defined Exception, bạn có thể sử dụng raise
để kích hoạt exception trong chương trình. Tạo ra ngoại lệ do người dùng định nghĩa bao gồm việc sử dụng câu lệnh raise, có thể thực hiện với hoặc không có thông báo và thuộc tính tùy chỉnh.
Cú pháp:
Sau đây là cú pháp cơ bản để tạo ra một ngoại lệ:
raise ExceptionType(args)
Ví dụ:
Trong ví dụ này, hàm “set_age” tạo ra một “InvalidAgeError” nếu độ tuổi nằm ngoài phạm vi hợp lệ:
def set_age(age):
if age < 18 or age > 100:
raise InvalidAgeError(age)
print(f"Age is set to {age}")
Cách handle User-Defined Exception
Sau khi tạo và sử dụng raise
để kích hoạt một User-Defined Exception, bạn cần xử lý nó để tránh làm gián đoạn chương trình. Python cung cấp cơ chế try-except
để bắt và xử lý exception, giúp chương trình tiếp tục chạy hoặc thực hiện các hành động phù hợp.
Cú pháp:
Dưới đây là cú pháp cơ bản để xử lý ngoại lệ:
try:
# Code có thể gây ra exception
except ExceptionType as e:
# Xử lý exception
Ví dụ: Trong ví dụ dưới đây, khối “try” gọi “set_age” với một độ tuổi không hợp lệ. Khối “except” bắt “InvalidAgeError” và in thông báo lỗi.
try:
set_age(150)
except InvalidAgeError as e:
print(f"Invalid age: {e.age}. {e.message}")
Ví dụ hoàn chỉnh về User-Defined Exception
Kết hợp tất cả các bước, dưới đây là một ví dụ hoàn chỉnh về việc tạo và sử dụng một ngoại lệ do người dùng định nghĩa:
class InvalidAgeError(Exception):
def __init__(self, age, message="Age must be between 18 and 100"):
self.age = age
self.message = message
super().__init__(self.message)
def __str__(self):
return f"{self.message}. Provided age: {self.age}"
def set_age(age):
if age < 18 or age > 100:
raise InvalidAgeError(age)
print(f"Age is set to {age}")
try:
set_age(150)
except InvalidAgeError as e:
print(f"Invalid age: {e.age}. {e.message}")
Kết quả:
Invalid age: 150. Age must be between 18 and 100
Handle exception với nhiều except
Bạn có thể bắt nhiều loại exception bằng cách sử dụng nhiều khối except
.
Ví dụ:
try:
age = int(input("Nhập tuổi: "))
if age < 18 or age > 100:
raise InvalidAgeError(age)
except InvalidAgeError as e:
print(f"Lỗi: {e}")
except ValueError:
print("Vui lòng nhập một số nguyên hợp lệ.")
except Exception as e:
print(f"Lỗi không xác định: {e}")
Giải thích:
except InvalidAgeError as e:
xử lý lỗi nếu giá trị tuổi không hợp lệ.except ValueError:
bắt lỗi nếu người dùng nhập không phải số nguyên.except Exception as e:
dùng để bắt bất kỳ exception nào khác không được xử lý trước đó.
Sử dụng finally để cleanup
Khối finally
luôn được thực thi, dù có exception hay không.
Ví dụ:
try:
age = int(input("Nhập tuổi: "))
if age < 18 or age > 100:
raise InvalidAgeError(age)
except InvalidAgeError as e:
print(f"Lỗi: {e}")
except ValueError:
print("Vui lòng nhập một số nguyên hợp lệ.")
except Exception as e:
print(f"Lỗi không xác định: {e}")
Giải thích:
finally
đảm bảo thông báo"Chương trình đã kết thúc."
luôn được in ra, dù có lỗi hay không.
Vietnix – Giải pháp lưu trữ tốc độ cao, bảo mật và ổn định
Vietnix là nhà cung cấp dịch vụ thuê server, hosting, VPS, domain hàng đầu tại Việt Nam, cam kết mang đến giải pháp lưu trữ hiệu quả, bảo mật cao và hỗ trợ kỹ thuật 24/7. Với hơn 80.000 khách hàng tin tưởng lựa chọn, Vietnix giúp doanh nghiệp tối ưu hóa hiệu suất và bảo vệ dữ liệu một cách an toàn.
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 18001093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, TP. Hồ Chí Minh
Câu hỏi thường gặp
Tại sao cần sử dụng User-Defined Exceptions thay vì các exception có sẵn trong Python?
Các exception mặc định như ValueError
hay TypeError
có thể không đủ cụ thể để mô tả các lỗi đặc thù trong chương trình của bạn. User-Defined Exceptions giúp phân loại lỗi rõ ràng hơn, giúp code dễ đọc và bảo trì hơn.
Có thể tạo User-Defined Exceptions với thông tin chi tiết không?
Có, bạn có thể định nghĩa __init__
để truyền thông tin chi tiết khi exception được kích hoạt:
class InvalidAgeError(Exception): def __init__(self, age, message="Age must be between 18 and 100"): self.age = age self.message = message super().__init__(self.message)
Sự khác biệt giữa User-Defined Exceptions và Built-in Exceptions là gì?
– Built-in Exceptions: Các exception mặc định của Python (TypeError
, ValueError
, IndexError
…)
– User-Defined Exceptions: Các exception do người dùng tự định nghĩa để xử lý lỗi theo yêu cầu cụ thể của chương trình.
Có cần phải ghi đè __str__
khi tạo User-Defined Exception không?
Không bắt buộc, nhưng nếu bạn muốn exception hiển thị thông tin chi tiết hơn khi in ra, bạn có thể ghi đè __str__
:
class InvalidAgeError(Exception): def __str__(self): return f"Invalid age: {self.age}. {self.message}"
Có thể sử dụng finally
khi xử lý User-Defined Exceptions không?
Có, finally
luôn được thực thi, dù có xảy ra exception hay không. Ví dụ:
try: set_age(150) except InvalidAgeError as e: print(f"Lỗi: {e}") finally: print("Chương trình kết thúc.")
Lời kết
Việc sử dụng User-Defined Exceptions giúp bạn quản lý lỗi hiệu quả, làm cho code dễ bảo trì và debug hơn. Với các kỹ thuật tạo, raise và handle exception trong Python mà mình đã chia sẻ, bạn có thể kiểm soát luồng chương trình tốt hơn và tránh các lỗi không mong muốn. Nếu bạn có bất cứ thắc mắc hay cần hỗ trợ gì, hãy để lại bình luận bên dưới, mình sẽ hỗ trợ nhanh nhất. Cảm ơn bạn đã đọc!
Mọi người cũng xem: