INTRODUCTION
FLOW CONTROL
FUNCTIONS
DATATYPES
OBJECT & CLASS
Bài tập Python: Lập trình hướng đối tượng (OOP) trong Python Lập trình hướng đối tượng trong Python Class Variables trong Python Tìm hiểu về Methods trong Python Cách sử dụng phương thức __init__() trong Python Các biến Instance trong Python Tìm hiểu về Class Attributes trong Python Hàm Static Methods trong Python Phương thức __str__ trong Python Phương thức __repr__ trong Python Phương thức eq trong Python Tìm hiểu phương thức __hash__ trong Python Phương thức __bool__ trong Python Phương thức del trong Python Tìm hiểu về lớp Property trong Python Tìm hiểu về nạp chồng toán tử trong Python Trình Decorator Property trong Python Thuộc tính chỉ đọc trong Python Thuộc tính Delete trong Python Sử dụng super() trong Python Sử dụng __slots__ trong Python Cách sử dụng Protocol trong Python Sử dụng Enum aliases và @enum.unique trong Python Tùy chỉnh và mở rộng lớp Enum trong Python Cách sử dụng hàm Auto() của Python Single Responsibility Principle trong Python Nguyên tắc Đóng-Mở trong Python Nguyên tắc thay thế Liskov - LSP trong Python Interface Segregation Principle - ISP trong Python. Nguyên tắc đảo ngược sự phụ thuộc trong Python Đa kế thừa trong Python Tìm hiểu về các lớp mixin trong Python Mô tả Descriptors trong Python Phân biệt Data Descriptor và Non-data Descriptor trong Python Phương thức __new__ trong Python Tìm hiểu về Class Type trong Python Lớp Metaclass trong Python Ví dụ sử dụng metaclass trong Python Tìm hiểu về decorator dataclass trong Python Tìm hiểu về các ngoại lệ trong Python Ngoại lệ Raise trong Python Sử dụng câu lệnh raise from trong Python Ngoại lệ tùy chỉnh trong Python Module trong Python Package trong Python Class trong Python Hàm khởi tạo trong Python Kế thừa trong Python Đa kế thừa trong Python Setter và Getter trong Python Override trong Python Interface trong Python Bài tập Python: Module và Class
ADVANCED TOPICS
BỔ SUNG
PYTHON CĂN BẢN
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Ngoại lệ tùy chỉnh trong Python

Trong bài viết này, bạn sẽ học cách định nghĩa các lớp ngoại lệ tùy chỉnh trong Python để xử lý các tình huống ngoại lệ cụ thể hơn theo nhu cầu của ứng dụng. Việc tạo ra các ngoại lệ tùy chỉnh giúp bạn không chỉ có khả năng kiểm soát chi tiết hơn các lỗi phát sinh mà còn làm cho mã nguồn của bạn trở nên dễ đọc và bảo trì hơn. Hãy cùng tìm hiểu cách định nghĩa và sử dụng các ngoại lệ tùy chỉnh trong Python!

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Giới thiệu về ngoại lệ tùy chỉnh trong Python

Để tạo một lớp ngoại lệ tùy chỉnh, bạn định nghĩa một lớp kế thừa từ lớp Exception tích hợp sẵn hoặc một trong các lớp con của nó, chẳng hạn như lớp ValueError.

Ví dụ về ngoại lệ tùy chỉnh:

Ví dụ dưới đây định nghĩa một lớp CustomException kế thừa từ lớp Exception:

Bài viết này được đăng tại [free tuts .net]

class CustomException(Exception):
    """ Lớp ngoại lệ tùy chỉnh của tôi """

Lưu ý rằng lớp CustomException có một chuỗi mô tả (docstring) và không cần thêm câu lệnh pass để đảm bảo cú pháp hợp lệ.

Để tạo ra ngoại lệ CustomException, bạn sử dụng câu lệnh raise. Ví dụ sau sử dụng câu lệnh raise để tạo ra CustomException:

try:
    raise CustomException('Đây là ngoại lệ tùy chỉnh của tôi')
except CustomException as ex:
    print(ex)

Kết quả:

Đây là ngoại lệ tùy chỉnh của tôi

Giống như các lớp ngoại lệ tiêu chuẩn, ngoại lệ tùy chỉnh cũng là các lớp. Do đó, bạn có thể thêm chức năng cho các lớp ngoại lệ tùy chỉnh như:

  • Thêm các thuộc tính và phương thức.
  • Thêm các phương thức như ghi lại ngoại lệ, định dạng đầu ra, v.v.
  • Ghi đè các phương thức __str____repr__.
  • Và làm bất kỳ điều gì khác mà bạn có thể làm với các lớp thông thường.

Trong thực tế, bạn sẽ muốn giữ các ngoại lệ tùy chỉnh được tổ chức bằng cách tạo một hệ thống phân cấp ngoại lệ tùy chỉnh. Hệ thống phân cấp ngoại lệ tùy chỉnh cho phép bạn bắt các ngoại lệ ở nhiều cấp độ khác nhau, giống như các lớp ngoại lệ tiêu chuẩn.

Ví dụ về ngoại lệ tùy chỉnh trong Python

Giả sử bạn cần phát triển một chương trình chuyển đổi nhiệt độ từ Fahrenheit sang Celsius.

Giá trị tối thiểu và tối đa của nhiệt độ trong Fahrenheit là 32 và 212. Nếu người dùng nhập một giá trị không trong khoảng này, bạn muốn tạo ra một ngoại lệ tùy chỉnh, chẳng hạn như FahrenheitError.

Định nghĩa lớp ngoại lệ FahrenheitError

Ví dụ dưới đây định nghĩa lớp ngoại lệ FahrenheitError:

class FahrenheitError(Exception):
    min_f = 32
    max_f = 212

    def __init__(self, f, *args):
        super().__init__(args)
        self.f = f

    def __str__(self):
        return f'Nhiệt độ {self.f} không nằm trong khoảng hợp lệ {self.min_f, self.max_f}'

Cách hoạt động:

  • Đầu tiên, định nghĩa lớp FahrenheitError kế thừa từ lớp Exception.
  • Thứ hai, thêm hai thuộc tính lớp min_fmax_f đại diện cho giá trị tối thiểu và tối đa của nhiệt độ Fahrenheit.
  • Thứ ba, định nghĩa phương thức __init__ nhận một giá trị Fahrenheit (f) và một số đối số vị trí (*args). Trong phương thức __init__, gọi phương thức __init__ của lớp cơ sở và gán đối số f cho thuộc tính thể hiện f.
  • Cuối cùng, ghi đè phương thức __str__ để trả về một chuỗi mô tả tùy chỉnh cho thể hiện của lớp.

Định nghĩa hàm fahrenheit_to_celsius

Hàm sau đây định nghĩa hàm fahrenheit_to_celsius nhận một nhiệt độ ở Fahrenheit và trả về nhiệt độ ở Celsius:

def fahrenheit_to_celsius(f: float) -> float:
    if f < FahrenheitError.min_f or f > FahrenheitError.max_f:
        raise FahrenheitError(f)

    return (f - 32) * 5 / 9

Hàm fahrenheit_to_celsius sẽ tạo ra ngoại lệ FahrenheitError nếu nhiệt độ đầu vào không trong khoảng hợp lệ. Nếu không, nó sẽ chuyển đổi nhiệt độ từ Fahrenheit sang Celsius.

Tạo chương trình chính

Chương trình chính sau đây sử dụng hàm fahrenheit_to_celsius và lớp ngoại lệ tùy chỉnh FahrenheitError:

if __name__ == '__main__':
    f = input('Nhập nhiệt độ ở Fahrenheit:')
    try:
        f = float(f)
    except ValueError as ex:
        print(ex)
    else:
        try:
            c = fahrenheit_to_celsius(float(f))
        except FahrenheitError as ex:
            print(ex)
        else:
            print(f'{f} Fahrenheit = {c:.4f} Celsius')

Cách hoạt động:

Đầu tiên, chương trình yêu cầu người dùng nhập nhiệt độ ở Fahrenheit.

f = input('Nhập nhiệt độ ở Fahrenheit:')

Thứ hai, chuyển đổi giá trị đầu vào thành kiểu float. Nếu không thể chuyển đổi, chương trình sẽ tạo ra ngoại lệ ValueError và hiển thị thông báo lỗi từ ngoại lệ đó:

try:
    f = float(f)
except ValueError as ex:
    print(ex)

Thứ ba, chuyển đổi nhiệt độ sang Celsius bằng cách gọi hàm fahrenheit_to_celsius và in ra thông báo lỗi nếu giá trị đầu vào không phải là một giá trị Fahrenheit hợp lệ:

try:
    c = fahrenheit_to_celsius(float(f))
except FahrenheitError as ex:
    print(ex)
else:
    print(f'{f} Fahrenheit = {c:.4f} Celsius')

Kết bài

Để định nghĩa một lớp ngoại lệ tùy chỉnh, bạn cần kế thừa từ lớp Exception hoặc các lớp con của nó, giúp bạn tạo ra những ngoại lệ đặc biệt phù hợp với nhu cầu của ứng dụng. Việc xây dựng hệ thống phân cấp lớp ngoại lệ không chỉ giúp tổ chức các lớp ngoại lệ rõ ràng hơn mà còn giúp bạn bắt và xử lý ngoại lệ ở nhiều cấp độ khác nhau, mang lại sự linh hoạt và hiệu quả trong việc quản lý lỗi trong chương trình.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top