Xử lý lỗi trong Python

Xử lý lỗi trong Python

Trong bài viết này, chúng tôi sẽ giải thích cách xử lý lỗi trong Python.

YouTube Video

Xử lý lỗi trong Python

Xử lý lỗi trong Python chủ yếu được thực hiện bằng cách sử dụng các từ khóa try, except, elsefinally. Sử dụng các cấu trúc này cho phép bạn phản hồi hợp lý khi xuất hiện lỗi trong chương trình của bạn. Bên dưới, chúng tôi sẽ giải thích cách sử dụng từng cái.

Khối try

Trong khối try, bạn viết mã mà bạn muốn thực thi. Nếu xảy ra lỗi trong khối này, chương trình sẽ ngay lập tức chuyển sang khối except.

 1try:
 2    # Code that may raise an error (division by zero, for example)
 3    #number = int(input("Enter a number: "))
 4    number = int("abc")
 5    result = 10 / number
 6    print("Result:", result)
 7except ValueError as e:
 8    # Handle invalid input (e.g. non-numeric input)
 9    print("Invalid input. Please enter a whole number.")
10    print(f"Value error: {e}")
11except ZeroDivisionError as e:
12    # Handle division by zero error
13    print("Cannot divide by zero!")
14    print(f"Zero division error: {e}")
  • Đoạn mã này là một ví dụ về việc phát hiện lỗi trong khối try và xử lý chúng một cách thích hợp bằng cách bắt lỗi ValueError hoặc ZeroDivisionError.

Khối except

Trong khối except, bạn viết mã sẽ được thực thi khi xuất hiện một lỗi (exception) cụ thể. Bạn cũng có thể xử lý các lỗi cụ thể tùy thuộc vào loại exception xảy ra.

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = 0
 4    result = 10 / number
 5    print("Result:", result)
 6except ZeroDivisionError as e:
 7    print("Cannot divide by zero!")
 8    print(f"Zero division error: {e}")
 9except ValueError as e:
10    print("Input was not a valid integer.")
11    print(f"Value error: {e}")
  • Đoạn mã này là một ví dụ về việc thực hiện các xử lý khác nhau cho từng loại ngoại lệ trong khối except khi có lỗi xảy ra trong khối try.

Xử lý nhiều exception cùng một lúc

Hãy chỉ định một tuple khi nhiều loại exception có thể chia sẻ cùng một logic xử lý.

1try:
2    my_list = [1, 2]
3    result = my_list[3] + 10 / 0
4except (IndexError, ZeroDivisionError) as e:
5    print(f"Exception occurred: {e}")
  • Đoạn mã này là một ví dụ về việc bắt cả hai ngoại lệ IndexErrorZeroDivisionError cùng lúc và xử lý các ngoại lệ theo cùng một cách.

Xử lý mọi exception mà không phân biệt

Bỏ qua tham số của except nếu bạn muốn xử lý mọi loại exception trong một khối duy nhất.

1try:
2    # This code might cause some exception
3    result = "10" + 5  # TypeError
4except Exception as e:
5    print("Unexpected error")
  • Tuy nhiên, xử lý các ngoại lệ cụ thể thay vì bắt không điều kiện tất cả các ngoại lệ sẽ hữu ích hơn cho việc tìm lỗi và gỡ lỗi. Bất cứ khi nào có thể, chỉ xử lý rõ ràng các ngoại lệ đã dự đoán trước như ValueError hoặc TypeError sẽ làm tăng độ ổn định của mã nguồn của bạn.

Khối else

Khối else chỉ được thực thi nếu không có lỗi nào xảy ra trong khối try.

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = 5
 4    result = 10 / number
 5except ZeroDivisionError as e:
 6    print("Cannot divide by zero!")
 7    print(f"Zero division error: {e}")
 8except ValueError as e:
 9    print("Input was not a valid integer.")
10    print(f"Value error: {e}")
11else:
12    # This block will execute only if no exceptions were raised
13    print("Result:", result)
  • Đoạn mã này là một ví dụ trong đó khối else chỉ được thực thi nếu không có lỗi nào xảy ra trong khối try.

Khối finally

Khối finally được sử dụng để viết mã sẽ luôn được thực thi ở cuối, bất kể có lỗi xảy ra trong khối try hay không. Nó rất hữu ích để giải phóng tài nguyên hoặc thực hiện các nhiệm vụ dọn dẹp.

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = int("abc")
 4    result = 10 / number
 5except ZeroDivisionError as e:
 6    print("Cannot divide by zero!")
 7    print(f"Zero division error: {e}")
 8except ValueError as e:
 9    print("Input was not a valid integer.")
10    print(f"Value error: {e}")
11else:
12    # This block will execute only if no exceptions were raised
13    print("Result:", result)
14finally:
15    # This block will always execute, regardless of whether an exception was raised
16    print("Execution completed.")
  • Đoạn mã này là một ví dụ chứng minh rằng khối finally sẽ được thực thi bất kể có ngoại lệ xảy ra hay không.

Từ khoá raise

Cũng có thể phát sinh một ngoại lệ bằng cách sử dụng từ khoá raise khi một số điều kiện trong mã hiện tại không được đáp ứng.

1def divide(a, b):
2    if b == 0:
3        raise ValueError("Cannot divide by zero.")
4    return a / b
5
6try:
7    result = divide(10, 0)
8except ValueError as e:
9    print(f"Error: {e}")
  • Đoạn mã này là một ví dụ về việc chủ động phát sinh ngoại lệ bằng từ khóa raise khi một điều kiện không được đáp ứng.

Kết luận

Bằng cách xử lý lỗi theo cách này, bạn có thể tránh cho chương trình bị dừng, hiển thị thông báo thích hợp cho người dùng và tiếp tục xử lý chương trình tiếp theo.

Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.

YouTube Video