0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Các Mô Hình Xử Lý Lỗi JavaScript Bạn Cần Biết

Đăng vào 8 tháng trước

• 6 phút đọc

Xử Lý Lỗi Trong JavaScript: Các Mô Hình và Thực Hành Tốt Nhất

Xử lý lỗi là một phần không thể tránh khỏi trong phát triển phần mềm. Bất kể là lỗi chính tả, lỗi gọi API hay dữ liệu đầu vào không mong muốn, lỗi JavaScript có thể làm hỏng ứng dụng của bạn nếu không được xử lý đúng cách. Việc xử lý lỗi tốt đảm bảo rằng ứng dụng của bạn đáng tin cậy, dễ gỡ lỗi và thân thiện với người dùng.

Trong bài viết này, chúng ta sẽ khám phá những mô hình xử lý lỗi thiết yếu trong JavaScript, kèm theo các ví dụ và thực hành tốt nhất.

Mục Lục

1. Cách Xử Lý Lỗi Cổ Điển với try...catch

Cách phổ biến nhất để xử lý lỗi trong JavaScript là sử dụng try...catch.

javascript Copy
function parseJSON(data) {
  try {
    return JSON.parse(data);
  } catch (error) {
    console.error("JSON không hợp lệ:", error.message);
    return null;
  }
}

console.log(parseJSON('{ "name": "Anshul" }')); // ✅ Hoạt động thành công
console.log(parseJSON("invalid-json"));         // ❌ Lỗi được xử lý một cách trơn tru

Thực Hành Tốt Nhất:

  • Luôn cung cấp một phương án dự phòng khi xảy ra lỗi.
  • Ghi lại lỗi với ngữ cảnh, không chỉ là một thông báo chung chung.

2. Sử Dụng finally

finally sẽ được thực thi bất kể thành công hay thất bại, rất hữu ích cho việc dọn dẹp.

javascript Copy
function fetchData() {
  try {
    console.log("Đang lấy dữ liệu...");
    throw new Error("Vấn đề mạng!");
  } catch (error) {
    console.error("Lỗi:", error.message);
  } finally {
    console.log("Dọn dẹp tài nguyên, đóng kết nối, v.v.");
  }
}
fetchData();

Thực Hành Tốt Nhất:

  • Sử dụng finally để giải phóng tài nguyên như tay cầm tệp, kết nối cơ sở dữ liệu hoặc trạng thái tải.

3. Xử Lý Lỗi Trong Async/Await

Khi sử dụng async/await, hãy bọc mã trong try...catch.

javascript Copy
async function getUser() {
  try {
    const res = await fetch("https://api.example.com/user");
    const data = await res.json();
    console.log(data);
  } catch (error) {
    console.error("Không thể lấy người dùng:", error.message);
  }
}
getUser();

Thực Hành Tốt Nhất:

  • Luôn giả định rằng các cuộc gọi mạng có thể thất bại. Hiển thị thông báo lỗi thân thiện với người dùng thay vì làm ứng dụng bị treo.

4. Xử Lý Lỗi Tập Trung

Thay vì rải rác try...catch khắp nơi, hãy sử dụng một bộ xử lý trung tâm.

javascript Copy
function handleError(error) {
  console.error("Xử lý lỗi toàn cục:", error.message);
  // Gửi lỗi đến dịch vụ giám sát như Sentry
}

async function safeExecute(fn) {
  try {
    await fn();
  } catch (error) {
    handleError(error);
  }
}

// Sử dụng
safeExecute(async () => {
  throw new Error("Có gì đó bị hỏng!");
});

Thực Hành Tốt Nhất:

  • Các bộ xử lý tập trung giúp gỡ lỗi dễ dàng hơn và tích hợp tốt với các công cụ ghi lại/giám sát.

5. Giảm Thiểu Lỗi Với Giá Trị Mặc Định

Đôi khi, thay vì làm hỏng, hãy quay lại một giá trị mặc định.

javascript Copy
function getUserName(user) {
  try {
    return user.profile.name;
  } catch {
    return "Khách"; // phương án dự phòng
  }
}

console.log(getUserName({ profile: { name: "Anshul" } })); // "Anshul"
console.log(getUserName(null));                           // "Khách"

Thực Hành Tốt Nhất:

  • Sử dụng phương án dự phòng cho các lỗi không nghiêm trọng (ví dụ: thiếu các trường tùy chọn).
  • Đối với các lỗi nghiêm trọng, hãy ghi lại chúng một cách thích hợp.

6. Ranh Giới Lỗi Trong Ứng Dụng Frontend

Trong React, Angular, Vue, sử dụng các ranh giới lỗi để ngăn chặn việc ứng dụng bị treo hoàn toàn.

Ví dụ trong React:

javascript Copy
class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    console.error("Lỗi bị bắt:", error, info);
  }

  render() {
    if (this.state.hasError) {
      return <h2>Có gì đó không ổn!</h2>;
    }
    return this.props.children;
  }
}

Thực Hành Tốt Nhất:

  • Sử dụng các ranh giới lỗi trong các framework UI để bắt các lỗi xảy ra trong quá trình render.

7. Các Lớp Lỗi Tùy Chỉnh

Tạo các loại lỗi tùy chỉnh để dễ dàng gỡ lỗi hơn.

javascript Copy
class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = "ValidationError";
  }
}

function validateAge(age) {
  if (age < 18) {
    throw new ValidationError("Tuổi phải từ 18 trở lên");
  }
  return true;
}

try {
  validateAge(16);
} catch (error) {
  if (error instanceof ValidationError) {
    console.error("Kiểm tra không hợp lệ:", error.message);
  } else {
    throw error;
  }
}

Thực Hành Tốt Nhất:

  • Sử dụng các lỗi tùy chỉnh cho các kiểm tra logic kinh doanh (ví dụ: xác thực, quyền hạn).

8. Thực Hành Tốt Nhất Cuối Cùng cho Xử Lý Lỗi JavaScript

  • Đừng im lặng nuốt lỗi – luôn ghi lại chúng.
  • Sử dụng thông báo lỗi có ý nghĩa với ngữ cảnh.
  • Tập trung xử lý lỗi cho khả năng bảo trì.
  • Sử dụng các lớp lỗi tùy chỉnh để gỡ lỗi tốt hơn.
  • Tích hợp với các công cụ giám sát (Sentry, LogRocket, v.v.).
  • Hiển thị thông điệp thân thiện với người dùng, không phải stack trace.

9. Kết Luận

Xử lý lỗi không chỉ là về việc ngăn chặn sự cố – mà còn là xây dựng các ứng dụng đáng tin cậy, dễ gỡ lỗi và thân thiện với người dùng. Bằng cách áp dụng những mô hình và thực hành tốt nhất này, bạn sẽ viết mã JavaScript sạch hơn, an toàn hơn, và xử lý những điều bất ngờ một cách trơn tru.

FAQ

1. Tại sao việc xử lý lỗi lại quan trọng trong phát triển phần mềm?
Việc xử lý lỗi quan trọng vì nó giúp ứng dụng của bạn hoạt động ổn định và dễ gỡ lỗi hơn, đồng thời tạo trải nghiệm người dùng tốt hơn.

2. Có những mô hình xử lý lỗi nào trong JavaScript?
Các mô hình phổ biến bao gồm try...catch, finally, xử lý lỗi tập trung, và sử dụng các lớp lỗi tùy chỉnh.

3. Làm thế nào để ghi lại lỗi hiệu quả?
Ghi lại lỗi với thông tin ngữ cảnh, giúp bạn dễ dàng xác định nguyên nhân và vị trí của lỗi.

4. Khi nào nên sử dụng giá trị mặc định khi xử lý lỗi?
Sử dụng giá trị mặc định cho các lỗi không nghiêm trọng, trong khi cần ghi lại các lỗi nghiêm trọng để xử lý sau.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào