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

Các giá trị Error Name trong JavaScript

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):

STTError NameMô tảVí dụ thường gặp
1EvalErrorLỗi trong hàm eval() (hiếm gặp, deprecated)eval("invalid code")
2RangeErrorGiá trị số ngoài phạm vi cho phépnew Array(-1), num.toFixed(1000)
3ReferenceErrorTham chiếu biến không tồn tạiconsole.log(x) (x chưa khai báo)
4SyntaxErrorLỗi cú pháp khi parse codeeval("if (true) {"), JSON.parse invalid
5TypeErrorGiá trị không phải kiểu mong đợinull.f(), "str".push()
6URIErrorLỗi encode/decode URIdecodeURI("%")
7InternalError (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
}