Khóa học python

Tự Định Nghĩa Exception trong Python

0 phút đọc

Trong Python, exception (ngoại lệ) là một cơ chế quan trọng để xử lý các lỗi xảy ra trong quá trình thực thi chương trình. Python cung cấp nhiều loại exception tích hợp sẵn, nhưng đôi khi bạn cần tạo ra các exception tùy chỉnh để xử lý các tình huống đặc biệt trong ứng dụng của mình. Bài viết này sẽ hướng dẫn chi tiết cách tự định nghĩa exception trong Python, kèm theo các ví dụ minh họa cụ thể.

Giới thiệu về Exception trong Python

Exception là gì?

Exception là các sự kiện bất thường hoặc lỗi xảy ra trong quá trình thực thi chương trình, làm gián đoạn luồng thực thi bình thường. Khi một exception xảy ra, Python sẽ dừng thực thi và tìm kiếm một khối lệnh except để xử lý exception đó.

Các loại Exception tích hợp sẵn

Python cung cấp nhiều loại exception tích hợp sẵn, chẳng hạn như ValueError, TypeError, IndexError, KeyError, và nhiều hơn nữa.

python Copy
# Ví dụ về các exception tích hợp sẵn
try:
    x = int("abc")  # ValueError
except ValueError as e:
    print(f"ValueError: {e}")

try:
    y = [1, 2, 3]
    print(y[5])  # IndexError
except IndexError as e:
    print(f"IndexError: {e}")

Output:

Copy
ValueError: invalid literal for int() with base 10: 'abc'
IndexError: list index out of range

Tự Định Nghĩa Exception trong Python

Tạo Exception Tùy Chỉnh

Bạn có thể tạo exception tùy chỉnh bằng cách định nghĩa một lớp mới kế thừa từ lớp Exception hoặc bất kỳ lớp exception tích hợp sẵn nào.

python Copy
# Tạo exception tùy chỉnh
class MyCustomError(Exception):
    pass

# Sử dụng exception tùy chỉnh
try:
    raise MyCustomError("Đây là một lỗi tùy chỉnh")
except MyCustomError as e:
    print(f"MyCustomError: {e}")

Output:

Copy
MyCustomError: Đây là một lỗi tùy chỉnh

Thêm Thuộc Tính và Phương Thức vào Exception Tùy Chỉnh

Bạn có thể thêm các thuộc tính và phương thức vào exception tùy chỉnh để cung cấp thêm thông tin về lỗi.

python Copy
# Tạo exception tùy chỉnh với thuộc tính và phương thức
class MyCustomError(Exception):
    def __init__(self, message, code):
        super().__init__(message)
        self.code = code

    def get_error_code(self):
        return self.code

# Sử dụng exception tùy chỉnh
try:
    raise MyCustomError("Đây là một lỗi tùy chỉnh", 404)
except MyCustomError as e:
    print(f"MyCustomError: {e}, Code: {e.get_error_code()}")

Output:

Copy
MyCustomError: Đây là một lỗi tùy chỉnh, Code: 404

Kế Thừa từ Exception Tích Hợp Sẵn

Bạn có thể kế thừa từ bất kỳ lớp exception tích hợp sẵn nào để tạo exception tùy chỉnh.

python Copy
# Tạo exception tùy chỉnh kế thừa từ ValueError
class MyValueError(ValueError):
    def __init__(self, message, value):
        super().__init__(message)
        self.value = value

    def get_value(self):
        return self.value

# Sử dụng exception tùy chỉnh
try:
    raise MyValueError("Giá trị không hợp lệ", 42)
except MyValueError as e:
    print(f"MyValueError: {e}, Value: {e.get_value()}")

Output:

Copy
MyValueError: Giá trị không hợp lệ, Value: 42

Ví dụ về Tự Định Nghĩa Exception trong Python

Exception Tùy Chỉnh cho Kiểm Tra Đầu Vào

Dưới đây là một ví dụ về exception tùy chỉnh để kiểm tra đầu vào của một hàm.

python Copy
# Tạo exception tùy chỉnh cho kiểm tra đầu vào
class InvalidInputError(Exception):
    def __init__(self, message, input_value):
        super().__init__(message)
        self.input_value = input_value

    def get_input_value(self):
        return self.input_value

# Hàm kiểm tra đầu vào
def check_input(value):
    if not isinstance(value, int):
        raise InvalidInputError("Đầu vào phải là số nguyên", value)
    if value < 0:
        raise InvalidInputError("Đầu vào phải là số dương", value)
    return True

# Sử dụng hàm kiểm tra đầu vào
try:
    check_input("abc")
except InvalidInputError as e:
    print(f"InvalidInputError: {e}, Input: {e.get_input_value()}")

try:
    check_input(-5)
except InvalidInputError as e:
    print(f"InvalidInputError: {e}, Input: {e.get_input_value()}")

Output:

Copy
InvalidInputError: Đầu vào phải là số nguyên, Input: abc
InvalidInputError: Đầu vào phải là số dương, Input: -5

Exception Tùy Chỉnh cho Xử Lý Tệp Tin

Dưới đây là một ví dụ về exception tùy chỉnh để xử lý các lỗi liên quan đến tệp tin.

python Copy
# Tạo exception tùy chỉnh cho xử lý tệp tin
class FileProcessingError(Exception):
    def __init__(self, message, filename):
        super().__init__(message)
        self.filename = filename

    def get_filename(self):
        return self.filename

# Hàm đọc tệp tin
def read_file(filename):
    try:
        with open(filename, "r") as f:
            return f.read()
    except FileNotFoundError:
        raise FileProcessingError("Tệp tin không tồn tại", filename)
    except IOError:
        raise FileProcessingError("Lỗi khi đọc tệp tin", filename)

# Sử dụng hàm đọc tệp tin
try:
    content = read_file("nonexistent_file.txt")
except FileProcessingError as e:
    print(f"FileProcessingError: {e}, Filename: {e.get_filename()}")

Output:

Copy
FileProcessingError: Tệp tin không tồn tại, Filename: nonexistent_file.txt

Exception Tùy Chỉnh cho Xử Lý Dữ Liệu

Dưới đây là một ví dụ về exception tùy chỉnh để xử lý các lỗi liên quan đến dữ liệu.

python Copy
# Tạo exception tùy chỉnh cho xử lý dữ liệu
class DataProcessingError(Exception):
    def __init__(self, message, data):
        super().__init__(message)
        self.data = data

    def get_data(self):
        return self.data

# Hàm xử lý dữ liệu
def process_data(data):
    if not isinstance(data, list):
        raise DataProcessingError("Dữ liệu phải là danh sách", data)
    if not all(isinstance(item, int) for item in data):
        raise DataProcessingError("Tất cả các phần tử trong danh sách phải là số nguyên", data)
    return [item * 2 for item in data]

# Sử dụng hàm xử lý dữ liệu
try:
    result = process_data("invalid_data")
except DataProcessingError as e:
    print(f"DataProcessingError: {e}, Data: {e.get_data()}")

try:
    result = process_data([1, 2, "three"])
except DataProcessingError as e:
    print(f"DataProcessingError: {e}, Data: {e.get_data()}")

Output:

Copy
DataProcessingError: Dữ liệu phải là danh sách, Data: invalid_data
DataProcessingError: Tất cả các phần tử trong danh sách phải là số nguyên, Data: [1, 2, 'three']

Các Thực Hành Tốt Nhất khi Tự Định Nghĩa Exception

Đặt Tên Exception Rõ Ràng

Đặt tên exception rõ ràng và mô tả để người đọc mã có thể dễ dàng hiểu được mục đích của exception.

python Copy
class InvalidInputError(Exception):
    pass

Thêm Thông Tin Hữu Ích

Thêm các thuộc tính và phương thức vào exception để cung cấp thêm thông tin hữu ích về lỗi.

python Copy
class InvalidInputError(Exception):
    def __init__(self, message, input_value):
        super().__init__(message)
        self.input_value = input_value

    def get_input_value(self):
        return self.input_value

Kế Thừa từ Exception Tích Hợp Sẵn

Kế thừa từ các lớp exception tích hợp sẵn để tận dụng các tính năng và hành vi mặc định của chúng.

python Copy
class MyValueError(ValueError):
    pass

Sử Dụng Exception Tùy Chỉnh Một Cách Hợp Lý

Sử dụng exception tùy chỉnh một cách hợp lý để xử lý các tình huống đặc biệt mà các exception tích hợp sẵn không thể xử lý tốt.

python Copy
class FileProcessingError(Exception):
    pass

Kết luận

Tự định nghĩa exception trong Python là một kỹ năng quan trọng giúp bạn xử lý các tình huống đặc biệt trong ứng dụng của mình một cách hiệu quả. Bằng cách tạo các exception tùy chỉnh, bạn có thể cung cấp thêm thông tin về lỗi và làm cho mã nguồn của bạn dễ đọc và bảo trì hơn. Hy vọng rằng các ví dụ và hướng dẫn trong bài viết này sẽ giúp bạn hiểu rõ hơn về cách tự định nghĩa exception trong Python và áp dụng chúng vào các dự án lập trình của mình.

Avatar
Được viết bởi

Admin Team

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

Không có dữ liệu

Không có dữ liệu

Gợi ý bài viết
Không có dữ liệu

Không có dữ liệu

Bình luận

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

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