Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Try Catch Finally trong JavaScript - Xử lý ngoại lệ

Try...Catch...Finally là cấu trúc xử lý ngoại lệ (exception handling) trong JavaScript:

  • try: Khối code có thể gây lỗi
  • catch: Bắt và xử lý lỗi (nhận đối tượng error)
  • finally: Luôn chạy sau try/catch (dù có lỗi hay không) - dùng cho cleanup

Ví dụ minh họa

<!DOCTYPE html>
<html lang="vi">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Try Catch Finally JS</title>
  <style>
    body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
    .result { font-size: 20px; font-weight: 500; margin: 10px 0; color: green; }
    button { padding: 8px 16px; cursor: pointer; }
  </style>
</head>
<body>
  <h1>Try Catch Finally trong JavaScript</h1>
  <div class="result" id="result"></div>
  <button class="Btn" id="btn">NHẤN VÀO ĐÂY</button>
  <h3> Nhấn nút để gây lỗi ReferenceError và xem finally chạy </h3>
  <script>
    const resEle = document.querySelector("#result");
    document.querySelector("#btn").addEventListener("click", () => {
      try {
        // Gây lỗi: truy cập biến chưa khai báo
        resEle.innerHTML = a; 
      } catch (err) {
        // Bắt lỗi
        resEle.innerHTML = "Error = " + err.message + "
"; resEle.innerHTML += "Error name = " + err.name + "
"; } finally { // Luôn chạy resEle.innerHTML += "→ Finally block đã thực thi!
"; } let a = 44; // Khai báo sau (TDZ) }); </script> </body> </html>

Kết quả

Error = Cannot access 'a' before initialization
Error name = ReferenceError
→ Finally block đã thực thi!

Luồng thực thi:

try {
  // 1. Chạy code này
  // Nếu KHÔNG lỗi → bỏ qua catch → chạy finally → xong
  // Nếu CÓ lỗi → nhảy ngay catch → chạy catch → chạy finally → xong
} catch (err) {
  // 2. Chỉ chạy nếu try có lỗi
  // err là đối tượng Error
} finally {
  // 3. LUÔN CHẠY (trừ khi process.exit, browser crash, infinite loop)
}

Các trường hợp finally KHÔNG chạy:

  • process.exit() (Node.js)
  • Browser crash / kill tab
  • Vòng lặp vô tận trong try/catch
  • window.close() trong một số trường hợp

Ứng dụng thực tế của finally:

// 1. Đóng resource (file, DB connection, network)
let resource;
try {
  resource = acquireResource();
  useResource(resource);
} catch (err) {
  handleError(err);
} finally {
  if (resource) resource.close(); // Luôn đóng
}

// 2. Loading state
setLoading(true);
try {
  const data = await fetchData();
  render(data);
} catch (err) {
  showError(err);
} finally {
  setLoading(false); // Luôn tắt loading
}

// 3. Cleanup timer/interval
const timer = setInterval(() => {}, 1000);
try {
  // ...
} finally {
  clearInterval(timer);
}

Lưu ý:

  • catch có thể bỏ qua tham số error (ES2019): catch { } - Optional Catch Binding
  • Có thể throw lại lỗi trong catch: throw err;
  • return trong try/catch vẫn chạy finally trước khi trả về