Python - Raising Exceptions

Raising Exceptions in Python

Trong Python, bạn có thể ném ngoại lệ một cách rõ ràng bằng cách sử dụng câu lệnh raise . Việc ném ngoại lệ cho phép bạn chỉ ra rằng đã xảy ra lỗi và kiểm soát luồng của chương trình của bạn bằng cách xử lý những ngoại lệ này một cách phù hợp.

Kích hoạt một ngoại lệ đề cập đến việc kích hoạt một điều kiện lỗi một cách rõ ràng trong chương trình của bạn. Điều này có thể hữu ích để xử lý các tình huống mà luồng bình thường của chương trình không thể tiếp tục do một lỗi hoặc một điều kiện không mong đợi.

Trong Python, bạn có thể nâng cao các ngoại lệ tích hợp như ValueError hoặc TypeError để chỉ ra các điều kiện lỗi phổ biến. Ngoài ra, bạn có thể tạo và nâng cao các ngoại lệ tùy chỉnh.

Raising Built-in Exceptions

Bạn có thể nâng cao bất kỳ ngoại lệ tích hợp nào bằng cách tạo một thể hiện của lớp ngoại lệ và sử dụng câu lệnh raise. Cú pháp như sau −

raise Exception("This is a general exception")

Example

Dưới đây là một ví dụ trong đó chúng ta ném ra một ValueError khi một hàm nhận được một đối số không hợp lệ −

def divide(a, b):
   if b == 0:
      raise ValueError("Cannot divide by zero")
   return a / b

try:
   result = divide(10, 0)
except ValueError as e:
   print(e)

Dưới đây là đầu ra của đoạn mã trên −

Cannot divide by zero

Raising Custom Exceptions

Ngoài các ngoại lệ tích hợp sẵn, bạn có thể định nghĩa và ném (raise) các ngoại lệ tùy chỉnh của riêng mình bằng cách tạo một lớp ngoại lệ mới kế thừa từ lớp ngoại lệ cơ bản (base Exception) hoặc bất kỳ lớp con nào của nó.

class MyCustomError(Exception):
   pass

def risky_function():
   raise MyCustomError("Something went wrong in risky_function")

try:
   risky_function()
except MyCustomError as e:
   print(e)

Đầu ra của đoạn mã trên như được hiển thị dưới đây −

Something went wrong in risky_function

Creating Custom Exceptions

Ngoại lệ tùy chỉnh rất hữu ích để xử lý các điều kiện lỗi cụ thể mà chỉ ứng dụng của bạn có, cung cấp báo cáo lỗi chính xác hơn và kiểm soát tốt hơn.

Để tạo một ngoại lệ tùy chỉnh trong Python, bạn định nghĩa một lớp mới kế thừa từ lớp Exception tích hợp sẵn hoặc bất kỳ lớp ngoại lệ tích hợp sẵn nào khác phù hợp. Lớp ngoại lệ tùy chỉnh này có thể có các thuộc tính và phương thức bổ sung để cung cấp ngữ cảnh chi tiết hơn về điều kiện lỗi.

Example

Trong ví dụ này −

  • We define a custom exception class "InvalidAgeError" that inherits from "Exception".
  • The __init__() method initializes the exception with the invalid age and a default error message.
  • The set_age() function raises "InvalidAgeError" if the provided age is outside the valid range.
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 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ả thu được như được hiển thị dưới đây −

Invalid age: 150. Age must be between 18 and 100

Re-Raising Exceptions

Đôi khi, bạn có thể cần bắt một ngoại lệ, thực hiện các hành động cụ thể (chẳng hạn như ghi nhật ký, dọn dẹp hoặc cung cấp bối cảnh bổ sung), và sau đó ném lại cùng một ngoại lệ để được xử lý ở phía trên của ngăn xếp gọi.

Điều này hữu ích khi bạn muốn đảm bảo rằng một số hành động nhất định được thực hiện khi xảy ra ngoại lệ, nhưng vẫn cho phép ngoại lệ được truyền đi để xử lý ở cấp độ cao hơn.

Để tái phát một ngoại lệ trong Python, bạn sử dụng câu lệnh "raise" mà không chỉ định một ngoại lệ nào, điều này sẽ tái phát ngoại lệ cuối cùng đang hoạt động trong phạm vi hiện tại.

Example

Trong ví dụ sau −

  • The process_file() function attempts to open and read a file.
  • If the file is not found, it prints an error message and re-raises the "FileNotFoundError" exception.
  • The exception is then caught and handled at a higher level in the call stack.
def process_file(filename):
   try:
      with open(filename, "r") as file:
         data = file.read()
         # Process data
   except FileNotFoundError as e:
      print(f"File not found: {filename}")
    	# Re-raise the exception
      raise  

try:
   process_file("nonexistentfile.txt")
except FileNotFoundError as e:
   print("Handling the exception at a higher level")

Sau khi thực thi đoạn mã trên, chúng ta nhận được kết quả sau −

File not found: nonexistentfile.txt
Handling the exception at a higher level