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();
}
}