Error

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

* Some parts of this feature may have varying levels of support.

Các đối tượng Error được ném ra khi xảy ra lỗi runtime. Đối tượng Error cũng có thể được dùng làm đối tượng cơ sở cho các ngoại lệ do người dùng định nghĩa. Xem bên dưới để biết các loại lỗi dựng sẵn tiêu chuẩn.

Mô tả

Các lỗi runtime dẫn đến việc tạo và ném ra các đối tượng Error mới.

Error là một serializable object, vì vậy nó có thể được nhân bản với structuredClone() hoặc sao chép giữa các Worker bằng cách sử dụng postMessage().

Các loại Error

Bên cạnh constructor Error chung, có các constructor lỗi cốt lõi khác trong JavaScript. Để biết về các ngoại lệ phía client, xem Các câu lệnh xử lý ngoại lệ.

EvalError

Tạo một instance đại diện cho lỗi xảy ra liên quan đến hàm toàn cục eval().

RangeError

Tạo một instance đại diện cho lỗi xảy ra khi một biến hoặc tham số số nằm ngoài phạm vi hợp lệ của nó.

ReferenceError

Tạo một instance đại diện cho lỗi xảy ra khi hủy tham chiếu một tham chiếu không hợp lệ.

SyntaxError

Tạo một instance đại diện cho lỗi cú pháp.

TypeError

Tạo một instance đại diện cho lỗi xảy ra khi một biến hoặc tham số không thuộc kiểu hợp lệ.

URIError

Tạo một instance đại diện cho lỗi xảy ra khi encodeURI() hoặc decodeURI() được truyền tham số không hợp lệ.

AggregateError

Tạo một instance đại diện cho nhiều lỗi được gói trong một lỗi duy nhất khi nhiều lỗi cần được báo cáo bởi một thao tác, ví dụ bởi Promise.any().

InternalError Non-standard

Tạo một instance đại diện cho lỗi xảy ra khi một lỗi nội bộ trong JavaScript engine được ném ra. Ví dụ: "too much recursion".

Constructor

Error()

Tạo một đối tượng Error mới.

Thuộc tính tĩnh

Error.stackTraceLimit Non-standard

Thuộc tính số không chuẩn giới hạn số lượng stack frame được bao gồm trong stack trace của lỗi.

Phương thức tĩnh

Error.captureStackTrace()

Hàm không chuẩn tạo thuộc tính stack trên đối tượng được cung cấp.

Error.isError()

Trả về true nếu đối số là một lỗi, hoặc false trong trường hợp ngược lại.

Error.prepareStackTrace() Non-standard Optional

Hàm không chuẩn mà nếu được cung cấp bởi code người dùng, sẽ được JavaScript engine gọi cho các ngoại lệ được ném ra, cho phép người dùng cung cấp định dạng tùy chỉnh cho stack trace. Xem tài liệu V8 Stack Trace API.

Thuộc tính instance

Các thuộc tính này được định nghĩa trên Error.prototype và được chia sẻ bởi tất cả các instance Error.

Error.prototype.constructor

Hàm constructor đã tạo ra đối tượng instance. Đối với các instance Error, giá trị khởi tạo là constructor Error.

Error.prototype.name

Đại diện cho tên của loại lỗi. Đối với Error.prototype.name, giá trị khởi tạo là "Error". Các lớp con như TypeErrorSyntaxError cung cấp các thuộc tính name riêng của chúng.

Error.prototype.stack Non-standard

Thuộc tính không chuẩn cho một stack trace.

Các thuộc tính này là thuộc tính riêng của mỗi instance Error.

cause

Nguyên nhân lỗi chỉ ra lý do tại sao lỗi hiện tại được ném ra — thường là một lỗi khác đã bắt được. Đối với các đối tượng Error do người dùng tạo, đây là giá trị được cung cấp làm thuộc tính cause của đối số thứ hai của constructor.

columnNumber Non-standard

Thuộc tính Mozilla không chuẩn cho số cột trong dòng đã gây ra lỗi này.

fileName Non-standard

Thuộc tính Mozilla không chuẩn cho đường dẫn đến tệp đã gây ra lỗi này.

lineNumber Non-standard

Thuộc tính Mozilla không chuẩn cho số dòng trong tệp đã gây ra lỗi này.

message

Thông báo lỗi. Đối với các đối tượng Error do người dùng tạo, đây là chuỗi được cung cấp làm đối số đầu tiên của constructor.

Phương thức instance

Error.prototype.toString()

Trả về chuỗi biểu diễn đối tượng được chỉ định. Ghi đè phương thức Object.prototype.toString().

Ví dụ

Ném một lỗi chung

Thông thường bạn tạo đối tượng Error với ý định ném nó bằng từ khóa throw. Bạn có thể xử lý lỗi bằng cấu trúc try...catch:

js
try {
  throw new Error("Whoops!");
} catch (e) {
  console.error(`${e.name}: ${e.message}`);
}

Xử lý một loại lỗi cụ thể

Bạn có thể chọn chỉ xử lý các loại lỗi cụ thể bằng cách kiểm tra loại lỗi với từ khóa instanceof:

js
try {
  foo.bar();
} catch (e) {
  if (e instanceof EvalError) {
    console.error(`${e.name}: ${e.message}`);
  } else if (e instanceof RangeError) {
    console.error(`${e.name}: ${e.message}`);
  }
  // etc.
  else {
    // If none of our cases matched leave the Error unhandled
    throw e;
  }
}

Phân biệt giữa các lỗi tương tự

Đôi khi một khối code có thể thất bại vì những lý do đòi hỏi cách xử lý khác nhau, nhưng lại ném ra các lỗi rất giống nhau (tức là, cùng loại và thông báo).

Nếu bạn không kiểm soát được các lỗi gốc được ném ra, một lựa chọn là bắt chúng và ném các đối tượng Error mới có thông báo cụ thể hơn. Lỗi gốc nên được truyền đến Error mới trong tham số options của constructor dưới dạng thuộc tính cause. Điều này đảm bảo rằng lỗi gốc và stack trace có sẵn cho các khối try/catch cấp cao hơn.

Ví dụ dưới đây minh họa điều này cho hai phương thức mà nếu không sẽ thất bại với các lỗi tương tự (doFailSomeWay()doFailAnotherWay()):

js
function doWork() {
  try {
    doFailSomeWay();
  } catch (err) {
    throw new Error("Failed in some way", { cause: err });
  }
  try {
    doFailAnotherWay();
  } catch (err) {
    throw new Error("Failed in another way", { cause: err });
  }
}

try {
  doWork();
} catch (err) {
  switch (err.message) {
    case "Failed in some way":
      handleFailSomeWay(err.cause);
      break;
    case "Failed in another way":
      handleFailAnotherWay(err.cause);
      break;
  }
}

Note: Nếu bạn đang xây dựng thư viện, bạn nên ưu tiên sử dụng error cause để phân biệt giữa các lỗi khác nhau — thay vì yêu cầu người dùng phân tích thông báo lỗi. Xem trang error cause để biết ví dụ.

Các loại error tùy chỉnh cũng có thể sử dụng thuộc tính cause, với điều kiện constructor của lớp con truyền tham số options khi gọi super(). Constructor lớp cơ sở Error() sẽ đọc options.cause và định nghĩa thuộc tính cause trên instance lỗi mới.

js
class MyError extends Error {
  constructor(message, options) {
    // Need to pass `options` as the second parameter to install the "cause" property.
    super(message, options);
  }
}

console.log(new MyError("test", { cause: new Error("cause") }).cause);
// Error: cause

Các loại error tùy chỉnh

Bạn có thể muốn định nghĩa các loại lỗi của riêng mình được dẫn xuất từ Error để có thể throw new MyError() và sử dụng instanceof MyError để kiểm tra loại lỗi trong exception handler. Điều này giúp code xử lý lỗi gọn gàng và nhất quán hơn.

Xem "What's a good way to extend Error in JavaScript?" trên Stack Overflow để có thảo luận chuyên sâu.

Warning: Subclassing dựng sẵn không thể được chuyển đổi đáng tin cậy sang code trước ES6, vì không có cách nào để xây dựng lớp cơ sở với một new.target cụ thể mà không có Reflect.construct(). Bạn cần cấu hình thêm hoặc gọi thủ công Object.setPrototypeOf(this, CustomError.prototype) ở cuối constructor; nếu không, instance được tạo sẽ không phải là instance CustomError. Xem TypeScript FAQ để biết thêm thông tin.

Note: Một số trình duyệt bao gồm constructor CustomError trong stack trace khi sử dụng các class ES2015.

js
class CustomError extends Error {
  constructor(foo = "bar", ...params) {
    // Pass remaining arguments (including vendor specific ones) to parent constructor
    super(...params);

    // Maintains proper stack trace for where our error was thrown (non-standard)
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }

    this.name = "CustomError";
    // Custom debugging information
    this.foo = foo;
    this.date = new Date();
  }
}

try {
  throw new CustomError("baz", "bazMessage");
} catch (e) {
  console.error(e.name); // CustomError
  console.error(e.foo); // baz
  console.error(e.message); // bazMessage
  console.error(e.stack); // stack trace
}

Đặc tả kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-error-objects

Tương thích trình duyệt

Xem thêm