Đăng nhập

Bài 17: try – except – Bắt lỗi và xử lý an toàn trong Python

Học đến đây rồi, bạn đã sẵn sàng bước vào một trong những kỹ năng quan trọng nhất trong lập trình: Xử lý lỗi. Không có phần mềm nào hoàn hảo – điều quan trọng là khi lỗi xảy ra, bạn xử lý nó thông minh, không để chương trình “văng” hoặc rơi vào trạng thái im lặng.


Viết code là để phục vụ con người, không chỉ máy tính

Dù bạn viết mã cẩn thận đến đâu, luôn có điều gì đó có thể sai:

  • Người dùng nhập sai dữ liệu
  • File không tồn tại
  • Mạng bị ngắt khi đang kết nối
  • Chia cho 0

Chính vì vậy, một lập trình viên giỏi không chỉ biết viết code chạy đúng – mà còn viết code xử lý khi mọi thứ… sai.

Python cung cấp một công cụ cực kỳ mạnh và dễ hiểu để bắt lỗi: try – except.


Mục tiêu bài học

  • Biết cách dùng try – except để bắt lỗi cơ bản
  • Biết phân biệt các loại lỗi thường gặp
  • Biết dùng finally để luôn thực hiện hành động (dù lỗi hay không)
  • Có thể hiển thị thông báo, ghi log, hoặc dừng nhẹ nhàng khi lỗi xảy ra

1. Cú pháp cơ bản

try:
    # đoạn mã có nguy cơ gây lỗi
except:
    # xử lý khi lỗi xảy ra

Ví dụ:

try:
    a = int(input("Nhập số: "))
    b = 10 / a
    print(b)
except:
    print("Có lỗi xảy ra! Bạn nhập gì thế?")

2. Bắt lỗi cụ thể

Bạn có thể chỉ bắt lỗi mà bạn muốn xử lý, giúp tránh bắt nhầm lỗi hoặc che giấu bug.

try:
    x = int("abc")
except ValueError:
    print("Không thể chuyển chuỗi sang số nguyên.")

Một số lỗi thường gặp:

LỗiKhi nào xảy ra
ValueErrorKhi chuyển dữ liệu không hợp lệ
ZeroDivisionErrorKhi chia cho 0
FileNotFoundErrorKhi mở file không tồn tại
TypeErrorKhi kiểu dữ liệu không đúng
IndexErrorKhi truy cập vị trí không tồn tại trong list

3. elsefinally

else: chạy nếu không có lỗi

try:
    print("Không lỗi")
except:
    print("Lỗi")
else:
    print("Chạy nếu không có lỗi")

finally: luôn luôn chạy

Dùng để dọn dẹp tài nguyên, đóng file, ghi log…

try:
    f = open("abc.txt")
except:
    print("Không mở được file")
finally:
    print("Đã thử xong, đóng tài nguyên nếu có")

4. Bắt nhiều loại lỗi

try:
    x = int(input("Nhập số: "))
    y = 10 / x
except ValueError:
    print("Không đúng định dạng số.")
except ZeroDivisionError:
    print("Không được chia cho 0.")

5. Dùng raise để chủ động báo lỗi

Bạn có thể tự kiểm tra điều kiện và chủ động ném lỗi:

x = -5
if x < 0:
    raise ValueError("Giá trị phải lớn hơn 0")

6. Ứng dụng thực tế: nhập lại nếu sai

while True:
    try:
        a = int(input("Nhập số nguyên dương: "))
        if a <= 0:
            raise ValueError
        break
    except:
        print("Nhập sai! Vui lòng thử lại.")

print("Bạn đã nhập:", a)

7. Bài tập luyện tập

Bài 1: Nhập một số, in nghịch đảo (1/x). Bắt lỗi chia cho 0 hoặc không phải số.

Bài 2: Mở file tên dulieu.txt. Nếu file không tồn tại, in ra thông báo.

Bài 3: Viết hàm nhận vào danh sách, trả về phần tử ở vị trí n. Nếu n sai, bắt lỗi IndexError.

Bài 4: Viết chương trình yêu cầu nhập tuổi, nếu nhập sai định dạng hoặc âm, yêu cầu nhập lại.

Bài 5: Ghi log lỗi vào file error_log.txt khi lỗi xảy ra (dùng with open(...) trong except)


Kết luận

Không có chương trình nào hoàn hảo. Nhưng một chương trình chuyên nghiệp sẽ không bao giờ chết bất ngờ, mà thông báo tử tế, xử lý nhẹ nhàng, và nếu cần, ghi lại lỗi để bạn có thể sửa sau.

try – except là kỹ năng bắt buộc để:

  • Làm việc với người dùng
  • Đọc ghi file
  • Kết nối mạng
  • Viết ứng dụng GUI

Bài tiếp theo: Bài 18 – Class và Object: Lập trình hướng đối tượng cơ bản

Chúng ta sẽ bước vào một cấp độ mới: tạo ra kiểu dữ liệu riêng của chính bạn với thuộc tính, hành vi, và mối quan hệ – đây là gốc rễ của lập trình hiện đại.

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.