Xử Lý Ngoại Lệ Trong Python

Xử Lý Ngoại Lệ

Trong quá trình chạy chương trình, lỗi có thể xảy ra. Chúng ta mong muốn chương trình hoạt động theo một cách nhất định, nhưng đôi khi các lỗi không lường trước được xuất hiện và chúng được gọi là ngoại lệ. Thông thường, ngoại lệ sẽ khiến chương trình dừng lại, vì vậy để tránh điều này, chúng ta cần xử lý ngoại lệ. Trong Python, chúng ta sử dụng cấu trúc `try ... except ...` để thực hiện việc này.

def tinh_thuong(x, y):
    try:
        return x / y
    except Exception as loi:
        print('Xảy ra lỗi:', type(loi), loi)

tinh_thuong(1, 0)
tinh_thuong(1, 'a')
Ở đây, `Exception` đại diện cho mọi loại ngoại lệ, `as loi` gán tên biệt danh cho ngoại lệ, và `loi` chính là đối tượng ngoại lệ cụ thể. Kết quả sau khi chạy:
Xảy ra lỗi: <class 'ZeroDivisionError'> division by zero
Xảy ra lỗi: <class 'TypeError'> unsupported operand type(s) for /: 'int' and 'str'
Nên xử lý riêng từng loại ngoại lệ khác nhau, ví dụ:

def tinh_thuong(x, y):
    try:
        return x / y
    except ZeroDivisionError:
        print('Số chia y không thể bằng 0')
    except TypeError:
        print('Kiểu dữ liệu của x và y phải là số')

tinh_thuong(1, 0)
tinh_thuong(1, 'a')
Kết quả sau khi chạy:
Số chia y không thể bằng 0
Kiểu dữ liệu của x và y phải là số
Có thể bắt nhiều ngoại lệ cùng lúc và xử lý tương tự như sau: `try: ... except (ZeroDivisionError, TypeError): ...` Hành động thực thi khi không có ngoại lệ hoặc bất kể có ngoại lệ hay không ----------------- Cấu trúc `try: ... except: ...` hỗ trợ thêm phần `else: ...` để thực thi khi không có ngoại lệ và `finally: ...` để luôn thực thi một số câu lệnh, ví dụ:

def tinh_thuong(x, y):
    try:
        ket_qua = x / y
    except ZeroDivisionError:
        print('Số chia y không thể bằng 0')
    except TypeError:
        print('Kiểu dữ liệu của x và y phải là số')
    else:
        print('Kết quả là', ket_qua)
        return ket_qua
    finally:
        print('Đã hoàn tất...')

tinh_thuong(4, 2)
tinh_thuong(1, 0)
tinh_thuong(1, 'a')
Kết quả sau khi chạy:
Kết quả là 2.0
Đã hoàn tất...
Số chia y không thể bằng 0
Đã hoàn tất...
Kiểu dữ liệu của x và y phải là số
Đã hoàn tất...
Các ngoại lệ phổ biến trong Python -----------
Loại ngoại lệMô tảVí dụ
SyntaxErrorLỗi cú pháp Python (lỗi thụt lề hoặc cú pháp)int a = 1
NameErrorLỗi tên biến (biến chưa được khai báo)print(a)
TypeErrorLỗi kiểu dữ liệuprint('a'/ 'b')
ValueErrorLỗi giá trị (giá trị không hợp lệ)int('a')
ZeroDivisionErrorLỗi chia cho 0 (số chia không thể bằng 0)10/0
IndexErrorLỗi chỉ số (chỉ số không tồn tại trong list)s = ['a', 'b', 'c'] ; print(s[5])
KeyErrorLỗi khóa (khóa không tồn tại trong dictionary)s = {'a':1, 'b':2, 'c':3} ; print(s['d'])
AttributeErrorLỗi thuộc tính (đối tượng không có thuộc tính đó)a = 'hello'; print(a.name)
AssertionErrorLỗi khẳng định (assertion thất bại)assert 1>2
FileNotFoundErrorTập tin không tồn tạiopen('abc.txt')
OSErrorLỗi hệ điều hànhos.mkdirs('/ddd/xxx')
Tự động ném ngoại lệ ------ Không nhất thiết phải bắt và xử lý tất cả các ngoại lệ trong chương trình. Đôi khi, ném ngoại lệ sớm với thông điệp rõ ràng cũng là cách tốt. Ví dụ:

def tinh_thuong(x, y):
    if not isinstance(x, (int, float)) or not isinstance(y, (int, float)):
        raise ValueError('x và y phải là int hoặc float')
    if y == 0:
        raise ValueError('Số chia y không thể bằng 0')
    return x / y

tinh_thuong(1, 0)
tinh_thuong(1, 'a')
Cũng có thể tạo ra các loại ngoại lệ tùy chỉnh để làm rõ hơn loại lỗi, ví dụ:

class LoiKhongPhaiSo(Exception):
    """Lỗi không phải số"""

class LoiBang0(Exception):
    """Lỗi bằng 0"""

def tinh_thuong(x, y):
    if not isinstance(x, (int, float)) or not isinstance(y, (int, float)):
        raise LoiKhongPhaiSo('x và y phải là int hoặc float')
    if y == 0:
        raise LoiBang0('Số chia y không thể bằng 0')
    return x / y

tinh_thuong(1, 0)
tinh_thuong(1, 'a')

Thẻ: python ExceptionHandling CustomExceptions

Đăng vào ngày 27 tháng 6 lúc 02:41