Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Ngoại lệ tùy chỉnh trong Python
Trong bài viết này, bạn sẽ học cách định nghĩa các lớp ngoại lệ tùy chỉnh trong Python để xử lý các tình huống ngoại lệ cụ thể hơn theo nhu cầu của ứng dụng. Việc tạo ra các ngoại lệ tùy chỉnh giúp bạn không chỉ có khả năng kiểm soát chi tiết hơn các lỗi phát sinh mà còn làm cho mã nguồn của bạn trở nên dễ đọc và bảo trì hơn. Hãy cùng tìm hiểu cách định nghĩa và sử dụng các ngoại lệ tùy chỉnh trong Python!
Giới thiệu về ngoại lệ tùy chỉnh trong Python
Để tạo một lớp ngoại lệ tùy chỉnh, bạn định nghĩa một lớp kế thừa từ lớp Exception
tích hợp sẵn hoặc một trong các lớp con của nó, chẳng hạn như lớp ValueError
.
Ví dụ về ngoại lệ tùy chỉnh:
Ví dụ dưới đây định nghĩa một lớp CustomException
kế thừa từ lớp Exception
:
Bài viết này được đăng tại [free tuts .net]
class CustomException(Exception): """ Lớp ngoại lệ tùy chỉnh của tôi """
Lưu ý rằng lớp CustomException
có một chuỗi mô tả (docstring) và không cần thêm câu lệnh pass
để đảm bảo cú pháp hợp lệ.
Để tạo ra ngoại lệ CustomException
, bạn sử dụng câu lệnh raise
. Ví dụ sau sử dụng câu lệnh raise
để tạo ra CustomException
:
try: raise CustomException('Đây là ngoại lệ tùy chỉnh của tôi') except CustomException as ex: print(ex)
Kết quả:
Đây là ngoại lệ tùy chỉnh của tôi
Giống như các lớp ngoại lệ tiêu chuẩn, ngoại lệ tùy chỉnh cũng là các lớp. Do đó, bạn có thể thêm chức năng cho các lớp ngoại lệ tùy chỉnh như:
- Thêm các thuộc tính và phương thức.
- Thêm các phương thức như ghi lại ngoại lệ, định dạng đầu ra, v.v.
- Ghi đè các phương thức
__str__
và__repr__
. - Và làm bất kỳ điều gì khác mà bạn có thể làm với các lớp thông thường.
Trong thực tế, bạn sẽ muốn giữ các ngoại lệ tùy chỉnh được tổ chức bằng cách tạo một hệ thống phân cấp ngoại lệ tùy chỉnh. Hệ thống phân cấp ngoại lệ tùy chỉnh cho phép bạn bắt các ngoại lệ ở nhiều cấp độ khác nhau, giống như các lớp ngoại lệ tiêu chuẩn.
Ví dụ về ngoại lệ tùy chỉnh trong Python
Giả sử bạn cần phát triển một chương trình chuyển đổi nhiệt độ từ Fahrenheit sang Celsius.
Giá trị tối thiểu và tối đa của nhiệt độ trong Fahrenheit là 32 và 212. Nếu người dùng nhập một giá trị không trong khoảng này, bạn muốn tạo ra một ngoại lệ tùy chỉnh, chẳng hạn như FahrenheitError
.
Định nghĩa lớp ngoại lệ FahrenheitError
Ví dụ dưới đây định nghĩa lớp ngoại lệ FahrenheitError
:
class FahrenheitError(Exception): min_f = 32 max_f = 212 def __init__(self, f, *args): super().__init__(args) self.f = f def __str__(self): return f'Nhiệt độ {self.f} không nằm trong khoảng hợp lệ {self.min_f, self.max_f}'
Cách hoạt động:
- Đầu tiên, định nghĩa lớp
FahrenheitError
kế thừa từ lớpException
. - Thứ hai, thêm hai thuộc tính lớp
min_f
vàmax_f
đại diện cho giá trị tối thiểu và tối đa của nhiệt độ Fahrenheit. - Thứ ba, định nghĩa phương thức
__init__
nhận một giá trị Fahrenheit (f
) và một số đối số vị trí (*args
). Trong phương thức__init__
, gọi phương thức__init__
của lớp cơ sở và gán đối sốf
cho thuộc tính thể hiệnf
. - Cuối cùng, ghi đè phương thức
__str__
để trả về một chuỗi mô tả tùy chỉnh cho thể hiện của lớp.
Định nghĩa hàm fahrenheit_to_celsius
Hàm sau đây định nghĩa hàm fahrenheit_to_celsius
nhận một nhiệt độ ở Fahrenheit và trả về nhiệt độ ở Celsius:
def fahrenheit_to_celsius(f: float) -> float: if f < FahrenheitError.min_f or f > FahrenheitError.max_f: raise FahrenheitError(f) return (f - 32) * 5 / 9
Hàm fahrenheit_to_celsius
sẽ tạo ra ngoại lệ FahrenheitError
nếu nhiệt độ đầu vào không trong khoảng hợp lệ. Nếu không, nó sẽ chuyển đổi nhiệt độ từ Fahrenheit sang Celsius.
Tạo chương trình chính
Chương trình chính sau đây sử dụng hàm fahrenheit_to_celsius
và lớp ngoại lệ tùy chỉnh FahrenheitError
:
if __name__ == '__main__': f = input('Nhập nhiệt độ ở Fahrenheit:') try: f = float(f) except ValueError as ex: print(ex) else: try: c = fahrenheit_to_celsius(float(f)) except FahrenheitError as ex: print(ex) else: print(f'{f} Fahrenheit = {c:.4f} Celsius')
Cách hoạt động:
Đầu tiên, chương trình yêu cầu người dùng nhập nhiệt độ ở Fahrenheit.
f = input('Nhập nhiệt độ ở Fahrenheit:')
Thứ hai, chuyển đổi giá trị đầu vào thành kiểu float. Nếu không thể chuyển đổi, chương trình sẽ tạo ra ngoại lệ ValueError
và hiển thị thông báo lỗi từ ngoại lệ đó:
try: f = float(f) except ValueError as ex: print(ex)
Thứ ba, chuyển đổi nhiệt độ sang Celsius bằng cách gọi hàm fahrenheit_to_celsius
và in ra thông báo lỗi nếu giá trị đầu vào không phải là một giá trị Fahrenheit hợp lệ:
try: c = fahrenheit_to_celsius(float(f)) except FahrenheitError as ex: print(ex) else: print(f'{f} Fahrenheit = {c:.4f} Celsius')
Kết bài
Để định nghĩa một lớp ngoại lệ tùy chỉnh, bạn cần kế thừa từ lớp Exception
hoặc các lớp con của nó, giúp bạn tạo ra những ngoại lệ đặc biệt phù hợp với nhu cầu của ứng dụng. Việc xây dựng hệ thống phân cấp lớp ngoại lệ không chỉ giúp tổ chức các lớp ngoại lệ rõ ràng hơn mà còn giúp bạn bắt và xử lý ngoại lệ ở nhiều cấp độ khác nhau, mang lại sự linh hoạt và hiệu quả trong việc quản lý lỗi trong chương trình.