Khi lỗi xảy ra, JavaScript tạo đối tượng Error với thuộc tính name chỉ loại lỗi. Có 6 loại lỗi chuẩn (Native Error Types):
| STT | Error Name | Mô tả | Ví dụ thường gặp |
|---|---|---|---|
| 1 | EvalError | Lỗi trong hàm eval() (hiếm gặp, deprecated) | eval("invalid code") |
| 2 | RangeError | Giá trị số ngoài phạm vi cho phép | new Array(-1), num.toFixed(1000) |
| 3 | ReferenceError | Tham chiếu biến không tồn tại | console.log(x) (x chưa khai báo) |
| 4 | SyntaxError | Lỗi cú pháp khi parse code | eval("if (true) {"), JSON.parse invalid |
| 5 | TypeError | Giá trị không phải kiểu mong đợi | null.f(), "str".push() |
| 6 | URIError | Lỗi encode/decode URI | decodeURI("%") |
| 7 | InternalError (non-standard) | Lỗi nội bộ engine (stack overflow...) | Đệ quy quá sâu |
Tất cả đều kế thừa từ Error. Có thể tạo custom error bằng throw new Error("msg") hoặc extend class 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>Error Name Values 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>Error Name Values 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 ra ReferenceError (gọi biến chưa khai báo) </h3>
<script>
const resEle = document.querySelector("#result");
document.querySelector("#btn").addEventListener("click", () => {
try {
// Gây ReferenceError: truy cập 'a' trước khi khai báo (TDZ)
resEle.innerHTML = a;
} catch (err) {
resEle.innerHTML = "Error name = " + err.name + "
";
resEle.innerHTML += "Error message = " + err.message + "
";
resEle.innerHTML += "Error stack = " + err.stack + "
";
}
let a = 44; // Khai báo sau (TDZ)
});
</script>
</body>
</html>
Kết quả
Error name = ReferenceError
Error message = Cannot access 'a' before initialization
Error stack = ReferenceError: Cannot access 'a' before initialization
at ...
Ví dụ các loại lỗi khác:
// RangeError
new Array(-1); // RangeError: Invalid array length
(123).toExponential(-1); // RangeError
// TypeError
null.foo; // TypeError: Cannot read property 'foo' of null
"string".push(1); // TypeError: "string".push is not a function
// SyntaxError
eval("var x = ;"); // SyntaxError
JSON.parse("{'invalid': 'json'}"); // SyntaxError (cần double quotes)
// URIError
decodeURI("%"); // URIError: URI malformed
// Custom Error
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError";
}
}
throw new ValidationError("Email không hợp lệ");
Best Practice xử lý lỗi:
try {
// Code rủi ro
} catch (err) {
// Phân loại lỗi bằng err.name
switch (err.name) {
case 'ReferenceError':
// Xử lý biến chưa khai báo
break;
case 'TypeError':
// Xử lý kiểu dữ liệu sai
break;
case 'SyntaxError':
// Xử lý JSON parse lỗi
break;
default:
// Lỗi khác
}
// Log lỗi
console.error(err.name, err.message, err.stack);
} finally {
// Luôn chạy - cleanup
}