Python - Xử Lý Ngoại Lệ
Chào bạn, những nhà thuật toán Python tương lai! Tôi rất vui được làm hướng dẫn cho bạn trong hành trình thú vị vào thế giới xử lý ngoại lệ Python. Như một người đã dạy lập trình trong nhiều năm, tôi có thể kể cho bạn biết rằng việc hiểu về ngoại lệ như học lái xe đạp với đèn đạp - nó có thể trở nên khó khăn ban đầu, nhưng một khi bạn đã quen, bạn sẽ lái xe mượt mà nhanh chóng!
Ngoại lệ là gì?
Trước khi chúng ta nhảy vào những vấn đề phức tạp, hãy bắt đầu với những khái niệm cơ bản. Hãy tưởng tượng bạn đang nấu bánh (hãy theo tôi, tôi hứa rằng điều này liên quan đến Python!). Bạn đã có công thức ( mã của bạn), nguyên liệu (dữ liệu của bạn), và bạn đã sẵn sàng. Nhưng điều gì sẽ xảy ra nếu bạn hết trứng giữa chừng? Đó là ngoại lệ trong thế giới nấu bánh!
Trong Python, ngoại lệ là lỗi xảy ra trong quá trình thực thi một chương trình. Nó giống như một cờ đỏ nổi lên kêu gọi: "Chờ chút! Có gì đó không hoàn hảo!"
Hãy xem một ví dụ đơn giản:
print(10 / 0)
Nếu bạn chạy mã này, Python sẽ ném ra một ZeroDivisionError
. Nó đang nói: "Hey, bạn không thể chia cho không! Điều đó không được phép trong nhà bếp của tôi... Tôi muốn nói là môi trường lập trình!"
Xử Lý Ngoại Lệ Trong Python
Bây giờ khi chúng ta biết ngoại lệ là gì, hãy học cách xử lý chúng một cách lịch sự. Trong Python, chúng ta sử dụng các khối try
và except
để bắt và xử lý ngoại lệ.
Dưới đây là cấu trúc cơ bản:
try:
# Mã có thể ném ra ngoại lệ
except LoaiNgoaiLe:
# Mã xử lý ngoại lệ
Hãy điều chỉnh ví dụ trước đó của chúng ta:
try:
ket_qua = 10 / 0
print(ket_qua)
except ZeroDivisionError:
print("Ôi! Bạn không thể chia cho không.")
Khi bạn chạy mã này, thay vì đổ vỡ, nó sẽ in ra: "Ôi! Bạn không thể chia cho không."
Clausula except
Không Có Ngoại Lệ
Đôi khi, bạn có thể muốn bắt bất kỳ ngoại lệ nào xảy ra. Trong trường hợp này, bạn có thể sử dụng một except
không có việc xác định loại ngoại lệ:
try:
# Một số mã nguy hiểm
x = int(input("Nhập một số: "))
y = 10 / x
print(y)
except:
print("Có gì đó không ổn!")
Điều này sẽ bắt bất kỳ ngoại lệ nào xảy ra trong khối try
. Tuy nhiên, nó thường là tốt hơn để bắt các ngoại lệ cụ thể khi bạn có thể, vì điều này làm cho mã của bạn trở nên chính xác và dễ gỡ lỗi hơn.
Clausula except
Với Nhiều Ngoại Lệ
Bạn cũng có thể xử lý nhiều ngoại lệ trong một except
duy nhất:
try:
x = int(input("Nhập một số: "))
y = 10 / x
print(y)
except (ValueError, ZeroDivisionError):
print("Đầu vào không hợp lệ hoặc chia cho không!")
Mã này sẽ bắt cả ValueError
(nếu người dùng nhập một giá trị không phải là số) và ZeroDivisionError
.
Khối try-finally
Khối finally
được sử dụng cho mã cần được thực thi bất kể ngoại lệ có xảy ra hay không. Nó giống như đội làm sạch sau một buổi tiệc - nó luôn xuất hiện, bất kể buổi tiệc diễn ra như thế nào!
try:
f = open("example.txt", "r")
# Thực hiện một số thao tác trên tệp
except FileNotFoundError:
print("Tệp không tồn tại!")
finally:
f.close() # Điều này sẽ luôn được thực thi, ngay cả khi có ngoại lệ xảy ra
Đối số của Ngoại Lệ
Ngoại lệ có thể mang theo thông tin bổ sung. Bạn có thể truy cập thông tin này trong khối except
của bạn:
try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"Đã xảy ra lỗi: {e}")
Điều này sẽ in ra: "Đã xảy ra lỗi: chia cho không"
Ném Ngoại Lệ
Đôi khi, bạn có thể muốn ném một ngoại lệ riêng của mình. Nó giống như là trọng tài trong một trận đấu và kêu gọi một việc phạm lỗi:
def kiem_tra_tuoi(tuoi):
if tuoi < 0:
raise ValueError("Tuổi không thể âm!")
print(f"Tuổi của bạn là {tuoi}")
try:
kiem_tra_tuoi(-5)
except ValueError as e:
print(e)
Điều này sẽ in ra: "Tuổi không thể âm!"
Ngoại Lệ Định Nghĩa Bởi Người Dùng
Bạn cũng có thể tạo các loại ngoại lệ riêng của mình. Nó giống như việc phát triển một quy tắc mới trong một trò chơi:
class QuaNhieuPizzaError(Exception):
pass
def dat_pizza(so_luong):
if so_luong > 100:
raise QuaNhieuPizzaError("Bạn không thể đặt nhiều hơn 100 pizza!")
print(f"Đặt {so_luong} pizza thành công.")
try:
dat_pizza(101)
except QuaNhieuPizzaError as e:
print(e)
Khẳng Định Trong Python
Khẳng định là cách để đảm bảo rằng một số điều kiện cụ thể được thỏa mãn. Chúng giống như những điểm kiểm tra nhỏ trong mã của bạn:
def chia(a, b):
assert b != 0, "Chia số không thể là không!"
return a / b
try:
ket_qua = chia(10, 0)
except AssertionError as e:
print(e)
Điều này sẽ in ra: "Chia số không thể là không!"
Ngoại Lệ Tiêu Chuẩn
Python đi kèm với một số ngoại lệ tích hợp. Dưới đây là một số ngoại lệ phổ biến nhất:
Tên Ngoại Lệ | Mô Tả |
---|---|
ZeroDivisionError | Ném khi có phép chia hoặc modulo bằng không xảy ra |
ValueError | Ném khi một hàm nhận một đối số của loại đúng nhưng giá trị không hợp lệ |
TypeError | Ném khi một hoạt động hoặc hàm được áp dụng vào một đối tượng của loại không thích hợp |
NameError | Ném khi một tên cục bộ hoặc toàn cầu không được tìm thấy |
FileNotFoundError | Ném khi một tệp hoặc thư mục được yêu cầu nhưng không tồn tại |
IndexError | Ném khi chỉ số chuỗi nằm ngoài phạm vi |
KeyError | Ném khi một khóa từ điển không được tìm thấy |
ImportError | Ném khi một câu lệnh nhập không thành công |
Và thế là bạn đã hoàn thành khóa học đột ngột về xử lý ngoại lệ Python. Hãy nhớ rằng ngoại lệ không phải là kẻ thù của bạn - chúng giống như các biển dẫn hữu ích chỉ đường cho bạn đến mã tốt hơn, độ bền vững hơn. Hãy tiếp tục tập luyện, thử nghiệm và sớm bạn sẽ xử lý ngoại lệ như một chuyên gia. Chúc bạn mãi mãi mã thuật!
Credits: Image by storyset