Làm thế nào để xác định các ngoại lệ tùy chỉnh trong Python? (Có ví dụ)

Trong hướng dẫn này, bạn sẽ học cách xác định các ngoại lệ tùy chỉnh tùy theo yêu cầu của bạn với sự trợ giúp của các ví dụ.

Python có rất nhiều ngoại lệ được tích hợp sẵn buộc chương trình của bạn xuất ra lỗi khi chương trình gặp sự cố.

Tuy nhiên, đôi khi bạn có thể cần tạo các ngoại lệ tùy chỉnh của riêng mình để phục vụ mục đích của bạn.

Tạo ngoại lệ tùy chỉnh

Trong Python, người dùng có thể xác định các ngoại lệ tùy chỉnh bằng cách tạo một lớp mới. Lớp ngoại lệ này phải được dẫn xuất, trực tiếp hoặc gián tiếp, từ lớp dựng sẵn Exception. Hầu hết các ngoại lệ cài sẵn cũng bắt nguồn từ lớp này.

 >>> class CustomError(Exception):… pass… >>> raise CustomError Traceback (most recent call last):… __main__.CustomError >>> raise CustomError("An error occurred") Traceback (most recent call last):… __main__.CustomError: An error occurred

Ở đây, chúng tôi đã tạo một ngoại lệ do người dùng định nghĩa được gọi là ngoại lệ CustomErrorkế thừa từ Exceptionlớp. Ngoại lệ mới này, giống như các ngoại lệ khác, có thể được nêu ra bằng cách sử dụng raisecâu lệnh với thông báo lỗi tùy chọn.

Khi chúng tôi đang phát triển một chương trình Python lớn, bạn nên đặt tất cả các ngoại lệ do người dùng xác định mà chương trình của chúng tôi đặt ra trong một tệp riêng biệt. Nhiều mô-đun tiêu chuẩn thực hiện điều này. Họ xác định các ngoại lệ của họ một cách riêng biệt là exceptions.pyhoặc errors.py(nói chung nhưng không phải luôn luôn).

Lớp ngoại lệ do người dùng định nghĩa có thể triển khai mọi thứ mà một lớp bình thường có thể làm, nhưng chúng tôi thường làm cho chúng đơn giản và ngắn gọn. Hầu hết các triển khai khai báo một lớp cơ sở tùy chỉnh và dẫn xuất các lớp ngoại lệ khác từ lớp cơ sở này. Khái niệm này được làm rõ hơn trong ví dụ sau.

Ví dụ: Ngoại lệ do người dùng xác định trong Python

Trong ví dụ này, chúng tôi sẽ minh họa cách có thể sử dụng các ngoại lệ do người dùng định nghĩa trong một chương trình để nêu ra và bắt lỗi.

Chương trình này sẽ yêu cầu người dùng nhập một số cho đến khi họ đoán đúng một số được lưu trữ. Để giúp họ tìm ra, một gợi ý được đưa ra là liệu dự đoán của họ lớn hơn hay nhỏ hơn số được lưu trữ.

 # define Python user-defined exceptions class Error(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(Error): """Raised when the input value is too small""" pass class ValueTooLargeError(Error): """Raised when the input value is too large""" pass # you need to guess this number number = 10 # user guesses a number until he/she gets it right while True: try: i_num = int(input("Enter a number: ")) if i_num number: raise ValueTooLargeError break except ValueTooSmallError: print("This value is too small, try again!") print() except ValueTooLargeError: print("This value is too large, try again!") print() print("Congratulations! You guessed it correctly.")

Đây là bản chạy mẫu của chương trình này.

Nhập một số: 12 Giá trị này quá lớn, hãy thử lại! Nhập một số: 0 Giá trị này quá nhỏ, hãy thử lại! Nhập một số: 8 Giá trị này quá nhỏ, hãy thử lại! Nhập một số: 10 Xin chúc mừng! Bạn đã đoán đúng.

Chúng tôi đã xác định một lớp cơ sở được gọi là Error.

Hai ngoại lệ khác ( ValueTooSmallErrorValueTooLargeError) mà chương trình của chúng tôi thực sự nêu ra được bắt nguồn từ lớp này. Đây là cách tiêu chuẩn để xác định các ngoại lệ do người dùng xác định trong lập trình Python, nhưng bạn không bị giới hạn chỉ với cách này.

Tùy chỉnh các lớp ngoại lệ

Chúng tôi có thể tùy chỉnh thêm lớp này để chấp nhận các đối số khác theo nhu cầu của chúng tôi.

Để tìm hiểu về cách tùy chỉnh các lớp Ngoại lệ, bạn cần có kiến ​​thức cơ bản về lập trình Hướng đối tượng.

Truy cập Lập trình hướng đối tượng trong Python để bắt đầu tìm hiểu về lập trình hướng đối tượng trong Python.

Hãy xem một ví dụ:

 class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)

Đầu ra

 Nhập số tiền lương: 2000 Traceback (lần gọi gần đây nhất): Tệp "", dòng 17, đang tăng SalaryNotInRangeError (lương) __main __. SalaryNotInRangeError: Lương không nằm trong phạm vi (5000, 15000)

Ở đây, chúng tôi đã ghi đè hàm tạo của Exceptionlớp để chấp nhận các đối số tùy chỉnh của riêng chúng tôi salarymessage. Sau đó, hàm tạo của Exceptionlớp cha được gọi theo cách thủ công với self.messageđối số bằng cách sử dụng super().

self.salaryThuộc tính tùy chỉnh được xác định để sử dụng sau này.

__str__Phương thức kế thừa của Exceptionlớp sau đó được sử dụng để hiển thị thông báo tương ứng khi SalaryNotInRangeErrorđược nâng lên.

Chúng tôi cũng có thể tùy chỉnh __str__chính phương thức đó bằng cách ghi đè nó.

 class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) def __str__(self): return f'(self.salary) -> (self.message)' salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)

Đầu ra

 Nhập số tiền lương: 2000 Traceback (cuộc gọi gần đây nhất): Tệp "/home/bsoyuj/Desktop/Untitled-1.py", dòng 20, đang tăng SalaryNotInRangeError (lương) __main __. SalaryNotInRangeError: 2000 -> Lương không bằng ( 5000, 15000) phạm vi

Để tìm hiểu thêm về cách bạn có thể xử lý ngoại lệ trong Python, hãy truy cập Xử lý ngoại lệ trong Python.

thú vị bài viết...