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 ý:
catchcó thể bỏ qua tham số error (ES2019):catch { }- Optional Catch Binding- Có thể
throwlại lỗi trong catch:throw err; returntrong try/catch vẫn chạy finally trước khi trả về