🧯 Xử Lý Lỗi – Bình tĩnh và chuyên nghiệp
Tư duy đúng
Lỗi là bình thường. Mục tiêu của chúng ta: phát hiện sớm, thông báo rõ ràng, và khôi phục an toàn. Đừng lo, điều này dễ hơn bạn nghĩ!
🧩 Cấu trúc cơ bản
try:
user_value = int(input("Nhập số: "))
except ValueError:
print("❌ Vui lòng nhập số hợp lệ!")
else:
print("✅ Giá trị hợp lệ:", user_value)
finally:
print("🔚 Hoàn tất.")
🎯 Bắt ngoại lệ cụ thể
def read_file(file_path):
try:
with open(file_path, "r", encoding="utf-8") as f:
return f.read()
except FileNotFoundError:
print("❌ Không tìm thấy file")
except PermissionError:
print("❌ Không có quyền truy cập")
except OSError as e:
print(f"❌ Lỗi hệ thống: {e}")
🛑 Chủ động báo lỗi: raise
def divide_numbers(a, b):
if b == 0:
raise ZeroDivisionError("Mẫu số phải khác 0")
return a / b
🧰 Tạo ngoại lệ tuỳ chỉnh
class AppError(Exception):
"""Lỗi chung trong ứng dụng."""
class ConfigError(AppError):
"""Lỗi cấu hình."""
def load_config(config_data):
if "key" not in config_data:
raise ConfigError("Thiếu trường 'key'")
🧹 Dọn dẹp tài nguyên với context manager
from contextlib import contextmanager
@contextmanager
def managed_resource(resource_name):
print(f"Mở {resource_name}")
try:
yield resource_name
finally:
print(f"Đóng {resource_name}")
with managed_resource("kết nối") as resource:
print("Đang dùng:", resource)
✅ Nguyên tắc vàng
- Bắt đúng loại lỗi; đừng dùng
except Exception
chung chung nếu không cần. - Thông điệp lỗi rõ ràng, thân thiện tiếng Việt.
- Ghi log khi hữu ích, nhưng không làm lộ thông tin nhạy cảm.
- Ưu tiên sửa nguyên nhân gốc thay vì che lỗi.
🧪 Bài tập nhanh
- Viết hàm đọc JSON từ file, bắt
JSONDecodeError
và thông báo dễ hiểu. - Viết decorator bắt lỗi và in thông báo gợi ý cho người dùng.
- Chuyển các thao tác mở/đóng file thủ công sang
with
.
👉 Áp dụng trong các dự án: thông báo lỗi ngắn gọn, dễ hiểu; luôn dọn dẹp tài nguyên.