Xử lý lỗi với Try / Except trong Python

1. Try / Except là gì?

Try / Except cho phép Python:

  • Cố gắng chạy một đoạn code (try block)
  • Nếu có lỗi xảy ra, nó sẽ bắt lỗi và chạy đoạn code xử lý (except block)
  • Chương trình không bị crash

Cú pháp:

try:
    # đoạn code có thể gây lỗi
except SomeErrorType:
    # xử lý khi lỗi xảy ra

2. Ví dụ cơ bản

Giả sử người dùng nhập chữ thay vì số:

try:
    value = int(input("Nhập số ngày: "))
    print(value * 24)
except ValueError:
    print("Input không phải là số hợp lệ!")

Giải thích:

  • int() sẽ gây lỗi ValueError nếu input không phải dạng số
  • except ValueError: bắt đúng loại lỗi đó
  • Chương trình không bị crash, mà in ra thông báo thân thiện

3. Tại sao dùng Try / Except thay vì If / Else?

If / ElseTry / Except
Dùng để kiểm tra trước khi chạy codeDùng để xử lý lỗi trong khi chạy
Cần viết điều kiện cho từng trường hợpMột lỗi cũng đủ để nhảy vào except
Không bắt được lỗi bất ngờBắt được lỗi không dự đoán trước

4. Ví dụ nâng cao — try / except bắt lỗi ValueError

Chúng ta thử nhập text, float, hay bất cứ giá trị sai:

try:
    user_input = input("Nhập số ngày:\n")
    user_number = int(user_input)   # nơi có thể lỗi
    print(f"{user_number} ngày = {user_number * 24} giờ")
except ValueError:
    print("Input không phải dạng số nguyên hợp lệ!")

Kết quả:

  • Nhập "abc" → except chạy
  • Nhập "19.99" → except chạy
  • Nhập "10" → chạy bình thường

5. Bắt mọi lỗi (không khuyến khích)

try:
    value = int(input("Nhập số: "))
    print(value * 10)
except:
    print("Có lỗi xảy ra!")

Không nên dùng except: trống, vì:

  • Bắt luôn cả lỗi nghiêm trọng
  • Khó debug
  • Không biết lỗi là gì

6. Kết hợp Try / Except với Validation

Try / Except bắt lỗi chuyển kiểu, nhưng:

  • Số âm
  • Số 0

→ không gây lỗi, nên phải kiểm tra bằng if.

Code hoàn chỉnh:

def days_to_hours(num_days):
    return num_days * 24

try:
    user_input = input("Nhập số ngày: ")
    user_number = int(user_input)  # Bắt lỗi nếu không phải số
    if user_number > 0:
        print(days_to_hours(user_number))
    elif user_number == 0:
        print("Không chấp nhận số 0!")
    else:
        print("Số âm không hợp lệ!")
except ValueError:
    print("Input không phải số hợp lệ!")

7. Nhiều except cho nhiều loại lỗi

try:
    number = int(input("Nhập số: "))
    result = 100 / number
except ValueError:
    print("Bạn phải nhập số!")
except ZeroDivisionError:
    print("Không thể chia cho 0!")

8. Khối finally (luôn chạy)

try:
    a = int(input("Nhập số: "))
except ValueError:
    print("Sai định dạng!")
finally:
    print("Kết thúc chương trình!")

TÓM TẮT KIẾN THỨC

  • try → chạy code có thể lỗi
  • except → chạy khi lỗi xảy ra
  • except ErrorType → bắt đúng loại lỗi
  • except: → bắt mọi lỗi (tránh dùng)
  • else: → chạy nếu không có lỗi
  • finally: → luôn chạy

EXERCISES + ANSWERS

Exercise 1 — Basic try/except

Yêu cầu:

Nhập một số. Nếu không phải số → in lỗi.

Answer:

try:
    x = int(input("Nhập số: "))
    print("Bạn nhập:", x)
except ValueError:
    print("Đó không phải là số!")

Exercise 2 — Divide with try/except

Yêu cầu:

Nhập số chia (100 / n), xử lý lỗi:

  • ValueError
  • ZeroDivisionError

Answer:

try:
    n = int(input("Nhập số để chia: "))
    print(100 / n)
except ValueError:
    print("Không phải số!")
except ZeroDivisionError:
    print("Không được chia cho 0!")

Exercise 3 — Days converter with try/except + validation

Yêu cầu:

  • Nhập số ngày
  • Bắt lỗi input
  • Nếu âm → báo lỗi
  • Nếu 0 → báo lỗi
  • Nếu hợp lệ → tính giờ

Answer:

try:
    d = int(input("Nhập số ngày:\n"))
    if d > 0:
        print(f"{d} ngày = {d * 24} giờ")
    elif d == 0:
        print("Số 0 không hợp lệ!")
    else:
        print("Không chấp nhận số âm!")
except ValueError:
    print("Input không phải số!")

Exercise 4 — Multiple error types

Yêu cầu:

Tính a / b, xử lý:

  • ValueError
  • ZeroDivisionError
  • bất kỳ lỗi khác → “unknown error”

Answer:

try:
    a = int(input("a = "))
    b = int(input("b = "))
    print(a / b)
except ValueError:
    print("Bạn phải nhập số nguyên!")
except ZeroDivisionError:
    print("Không được chia cho 0!")
except:
    print("Unknown error")

Exercise 5 — Try/Except with return inside function

Viết hàm:

  • Nhận input từ người dùng
  • Chuyển thành số bằng try
  • Nếu lỗi → return thông báo
  • Nếu đúng → return số nhân 10

Answer:

def convert_and_multiply():
    try:
        x = int(input("Nhập số: "))
        return x * 10
    except ValueError:
        return "Input không phải số!"

print(convert_and_multiply())