jsrosetta

Xử lý lỗi

Xử lý lỗi và try/catch

throw, try/catch/finally của Node.js so với error value (Go), Result (Rust), throws (Swift), exception (Java).

JavaScript cho phép throw bất cứ thứ gì, ở bất cứ đâu, và người gọi không hề biết hàm có thể ném lỗi. Các ngôn ngữ dưới đây chia thành hai trường phái:

  • Lỗi là giá trị trả về: Go, Rust. Người gọi buộc phải xử lý.
  • Exception: Swift, Java. Giống JavaScript nhưng chặt hơn về kiểu.

Định nghĩa, ném và bắt lỗi

class NotFoundError extends Error {
  constructor(id) {
    super(`user ${id} not found`);
    this.name = "NotFoundError";
  }
}
 
function findUser(id) {
  if (id !== 1) throw new NotFoundError(id);
  return { id, name: "neko" };
}
 
try {
  const user = findUser(2);
  console.log(user.name);
} catch (err) {
  if (err instanceof NotFoundError) console.error(err.message);
  else throw err;
} finally {
  console.log("done");
}

Ném lỗi tiếp lên trên (rethrow)

Trong JavaScript, lỗi không bắt sẽ tự nổi lên người gọi. Go và Rust bắt bạn viết rõ điều đó:

function greet(id) {
  const user = findUser(id); // lỗi tự nổi lên
  return `hi ${user.name}`;
}

Lấy giá trị mặc định khi lỗi

let name;
try {
  name = findUser(2).name;
} catch {
  name = "guest";
}

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#errors