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

Optional Catch Binding (Catch không bắt buộc) trong JavaScript

Catch Binding Tùy chọn (ES2019)

Trước ES2019, khối catch bắt buộc phải có một tham số để nhận đối tượng lỗi:

try {
    // code rủi ro
} catch (error) {  // bắt buộc có tham số
    console.log(error);
}

Từ ES2019 (ES10), bạn có thể bỏ qua tham số này nếu không cần dùng đến đối tượng lỗi:

try {
    // code rủi ro
} catch {  // không cần tham số
    console.log("Có lỗi xảy ra");
}

Khi nào nên dùng?

  • Bạn đã biết trước loại lỗi có thể xảy ra.
  • Bạn chỉ muốn xử lý chung mà không cần chi tiết lỗi.
  • Code ngắn gọn hơn khi không sử dụng biến error.

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>Optional Catch Binding</title>
    <style>
        body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
        .result { font-size: 20px; font-weight: 500; color: green; }
        button { padding: 8px 16px; cursor: pointer; }
    </style>
</head>
<body>
    <h1>Optional Catch Binding trong JavaScript</h1>
    <div class="result"></div>
    <button class="btn-demo">GÂY RA LỖI</button>
    <h3>Nhấn nút để gây ra lỗi ReferenceError</h3>

    <script>
        const resEle = document.querySelector(".result");
        const btn = document.querySelector(".btn-demo");

        btn.addEventListener("click", () => {
            try {
                // 'a' chưa được khai báo → ReferenceError
                resEle.innerHTML = a;
            } catch {
                // Không cần tham số error
                resEle.innerHTML = "Biến 'a' chưa được khai báo";
            }
        });
    </script>
</body>
</html>

So sánh với catch truyền thống

// Cũ (vẫn hợp lệ)
try {
    JSON.parse("invalid json");
} catch (e) {
    console.log("Lỗi parse:", e.message);
}

// Mới (ES2019) - khi không cần 'e'
try {
    JSON.parse("invalid json");
} catch {
    console.log("Dữ liệu JSON không hợp lệ");
}

Lưu ý quan trọng

  • Nếu bạn cần truy cập đối tượng lỗi (ví dụ: error.message, error.stack, error.name), vẫn phải khai báo tham số.
  • Tính năng này chỉ là cú pháp đường men (syntactic sugar), không thay đổi hành vi runtime.
  • Hỗ trợ: Chrome 66+, Firefox 58+, Safari 11.1+, Edge 79+.

Ví dụ thực tế: Fetch API

async function fetchData() {
    try {
        const response = await fetch('/api/data');
        if (!response.ok) throw new Error('Network error');
        return await response.json();
    } catch {
        // Xử lý chung: hiển thị toast, log analytics, fallback data
        showErrorMessage("Không thể tải dữ liệu");
        return getDefaultData();
    }
}