Khóa học python

Xử lý Exception trong Python

0 phút đọc

Exception (ngoại lệ) là các sự kiện bất thường xảy ra trong quá trình thực thi chương trình, gây ra sự gián đoạn và có thể dẫn đến việc chương trình bị dừng đột ngột. Xử lý exception là một phần quan trọng trong lập trình, giúp bạn kiểm soát và quản lý các lỗi một cách hiệu quả, đảm bảo chương trình hoạt động ổn định và đáng tin cậy.

Các Loại Exception trong Python

Python cung cấp nhiều loại exception tích hợp sẵn, bao gồm:

  • ZeroDivisionError: Xảy ra khi chia một số cho 0.
  • IndexError: Xảy ra khi truy cập một chỉ số không hợp lệ trong danh sách.
  • KeyError: Xảy ra khi truy cập một key không tồn tại trong dictionary.
  • ValueError: Xảy ra khi một hàm nhận một đối số có giá trị không hợp lệ.
  • TypeError: Xảy ra khi một thao tác hoặc hàm được áp dụng cho một đối tượng có kiểu không hợp lệ.
  • FileNotFoundError: Xảy ra khi cố gắng mở một file không tồn tại.

Cú pháp của Xử lý Exception

Python sử dụng các khối try, except, else, và finally để xử lý exception.

Cú pháp cơ bản

try:
    # Mã có thể gây ra exception
    pass
except SomeException as e:
    # Xử lý exception
    pass
else:
    # Mã thực thi nếu không có exception
    pass
finally:
    # Mã luôn được thực thi
    pass

Ví dụ về Xử lý Exception

Ví dụ 1: Xử lý ZeroDivisionError

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")
else:
    print(f"Result: {result}")
finally:
    print("This block is always executed.")

Kết quả:

Error: division by zero
This block is always executed.

Trong ví dụ trên, exception ZeroDivisionError được bắt và xử lý trong khối except. Khối finally luôn được thực thi, bất kể có exception hay không.

Ví dụ 2: Xử lý Multiple Exceptions

try:
    value = int("abc")
except ValueError as e:
    print(f"ValueError: {e}")
except TypeError as e:
    print(f"TypeError: {e}")
else:
    print(f"Value: {value}")
finally:
    print("This block is always executed.")

Kết quả:

ValueError: invalid literal for int() with base 10: 'abc'
This block is always executed.

Trong ví dụ trên, exception ValueError được bắt và xử lý trong khối except tương ứng.

Ví dụ 3: Xử lý Exception với else

try:
    value = int("123")
except ValueError as e:
    print(f"ValueError: {e}")
else:
    print(f"Value: {value}")
finally:
    print("This block is always executed.")

Kết quả:

Value: 123
This block is always executed.

Trong ví dụ trên, không có exception xảy ra, do đó khối else được thực thi.

Tạo Exception Tùy Chỉnh

Bạn có thể tạo các exception tùy chỉnh bằng cách kế thừa từ lớp Exception.

Ví dụ: Tạo Exception Tùy Chỉnh

class CustomError(Exception):
    def __init__(self, message):
        self.message = message

try:
    raise CustomError("This is a custom error.")
except CustomError as e:
    print(f"CustomError: {e.message}")

Kết quả:

CustomError: This is a custom error.

Trong ví dụ trên, exception tùy chỉnh CustomError được tạo và ném ra bằng cách sử dụng từ khóa raise.

Sử dụng raise để Ném Exception

Bạn có thể sử dụng từ khóa raise để ném một exception, cho phép bạn kiểm soát khi nào và tại sao một exception được ném ra.

Ví dụ: Sử dụng raise

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(f"Error: {e}")

Kết quả:

Error: Cannot divide by zero.

Trong ví dụ trên, exception ValueError được ném ra khi cố gắng chia cho 0.

Sử dụng finally để Dọn Dẹp Tài Nguyên

Khối finally luôn được thực thi, bất kể có exception hay không. Điều này rất hữu ích để dọn dẹp tài nguyên, chẳng hạn như đóng file hoặc kết nối mạng.

Ví dụ: Sử dụng finally

try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError as e:
    print(f"Error: {e}")
finally:
    if 'file' in locals() and not file.closed:
        file.close()
        print("File closed.")

Kết quả:

Error: [Errno 2] No such file or directory: 'example.txt'

Trong ví dụ trên, khối finally đảm bảo rằng file được đóng nếu nó đã được mở.

Xử lý Exception trong Các Tình Huống Thực Tế

Ví dụ: Xử lý Exception trong Đọc File

def read_file(file_path):
    try:
        with open(file_path, "r") as file:
            return file.read()
    except FileNotFoundError as e:
        print(f"Error: {e}")
    except IOError as e:
        print(f"IOError: {e}")

content = read_file("example.txt")
if content:
    print(content)

Kết quả:

Error: [Errno 2] No such file or directory: 'example.txt'

Trong ví dụ trên, các exception FileNotFoundErrorIOError được bắt và xử lý khi đọc file.

Ví dụ: Xử lý Exception trong Kết Nối Mạng

import requests

def fetch_data(url):
    try:
        response = requests.get(url)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.HTTPError as e:
        print(f"HTTPError: {e}")
    except requests.exceptions.ConnectionError as e:
        print(f"ConnectionError: {e}")
    except requests.exceptions.Timeout as e:
        print(f"Timeout: {e}")
    except requests.exceptions.RequestException as e:
        print(f"RequestException: {e}")

data = fetch_data("https://api.example.com/data")
if data:
    print(data)

Kết quả:

HTTPError: 404 Client Error: Not Found for url: https://api.example.com/data

Trong ví dụ trên, các exception liên quan đến kết nối mạng được bắt và xử lý khi thực hiện yêu cầu HTTP.

Sử dụng assert để Kiểm Tra Điều Kiện

Từ khóa assert được sử dụng để kiểm tra các điều kiện và ném ra AssertionError nếu điều kiện không đúng. Điều này rất hữu ích để kiểm tra các giả định trong mã nguồn.

Ví dụ: Sử dụng assert

def divide(a, b):
    assert b != 0, "Cannot divide by zero."
    return a / b

try:
    result = divide(10, 0)
except AssertionError as e:
    print(f"AssertionError: {e}")

Kết quả:

AssertionError: Cannot divide by zero.

Trong ví dụ trên, AssertionError được ném ra khi cố gắng chia cho 0.

Kết Luận

Xử lý exception là một phần quan trọng trong lập trình, giúp bạn kiểm soát và quản lý các lỗi một cách hiệu quả, đảm bảo chương trình hoạt động ổn định và đáng tin cậy. Python cung cấp các công cụ mạnh mẽ để xử lý exception, bao gồm các khối try, except, else, và finally, cũng như khả năng tạo các exception tùy chỉnh và sử dụng từ khóa raise để ném exception.

Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về cách xử lý exception trong Python và cách sử dụng các phương pháp khác nhau để đạt được mục tiêu của bạn.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Liệt kê các kiểu dữ liệu trong Python?

entry

Biến cục bộbiến toàn cục trong Python là gì?

entry

Trong Python có những built-in types nào?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào

Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely