본문 바로가기
javascript/모던 자바스크립트 Deep Dive

Error

by yongfront 2024. 2. 22.
반응형
SMALL

 

JavaScript에서 에러 객체(Error object)는 실행 시간(runtime) 에러가 발생했을 때 생성되는 객체입니다. 이 객체는 에러에 대한 상세한 정보를 담고 있으며, 프로그래머가 에러 처리를 보다 효과적으로 할 수 있게 돕습니다. 에러 객체는 Error 생성자 함수를 사용하여 직접 생성할 수도 있습니다.

기본 에러 객체

JavaScript의 Error 객체는 다음과 같은 주요 속성을 가지고 있습니다:

  • message: 에러 메시지를 문자열로 담고 있습니다. 이 메시지는 에러가 무엇인지 설명합니다.
  • name: 에러의 이름을 담고 있는 문자열입니다. 기본 에러 객체의 경우, **"Error"**라는 이름을 가집니다.
let error = new Error("Something went wrong");
console.log(error.message); // Something went wrong
console.log(error.name); // Error

내장 에러 유형

JavaScript는 Error 외에도 여러 가지 내장 에러 유형을 제공합니다. 각각의 에러 유형은 다양한 에러 상황을 나타냅니다:

  • RangeError: 숫자 변수나 파라미터가 유효한 범위를 벗어났을 때 발생합니다.
  • ReferenceError: 존재하지 않는 변수를 참조하려고 할 때 발생합니다.
  • SyntaxError: 코드에 문법적 오류가 있을 때 발생합니다.
  • TypeError: 변수나 파라미터가 예상된 타입이 아닐 때 발생합니다.
  • URIError: encodeURI() 또는 decodeURI() 같은 글로벌 URI 처리 함수에 부적절한 파라미터가 제공됐을 때 발생합니다.

에러 객체 확장

Error 객체를 확장하여 사용자 정의 에러를 만들 수 있습니다. 이를 통해 특정 에러 상황에 맞는 추가 정보를 에러 객체에 포함시킬 수 있습니다.

class CustomError extends Error {
  constructor(message, data) {
    super(message); // 부모 클래스의 생성자 호출
    this.name = "CustomError"; // 에러 이름 설정
    this.data = data; // 추가 데이터
  }
}

try {
  throw new CustomError("Custom error occurred", { userId: 1 });
} catch (error) {
  console.log(error.name); // CustomError
  console.log(error.message); // Custom error occurred
  console.log(error.data); // { userId: 1 }
}

에러 객체의 사용

에러 객체는 에러 처리(try...catch 문)에서 유용하게 사용됩니다. catch 블록에서 에러 객체를 받아 에러의 상세 정보를 로그에 기록하거나, 에러에 따라 적절한 대응을 할 수 있습니다.

에러 객체를 활용하면 에러 상황을 보다 명확하게 이해하고, 프로그램의 안정성을 높이는 데 도움을 줍니다.

 

JavaScript에서 에러 처리는 프로그램이 예상치 못한 상황을 만났을 때 안전하게 반응하고, 가능한 회복하도록 돕는 중요한 부분입니다. 에러 처리를 통해 애플리케이션의 안정성과 사용자 경험을 향상시킬 수 있습니다.

try...catch 문

JavaScript에서 가장 기본적인 에러 처리 방법은 try...catch 문을 사용하는 것입니다. try 블록 안에는 예외가 발생할 수 있는 코드를 넣고, catch 블록 안에는 에러가 발생했을 때 실행할 코드를 작성합니다.

try {
  // 에러가 발생할 수 있는 코드
  console.log(undefinedVariable); // 정의되지 않은 변수 접근
} catch (error) {
  // 에러 처리 코드
  console.error("Caught an error:", error);
}

finally 절

finally 절은 에러 발생 여부와 상관없이 실행되어야 하는 코드를 포함시킬 때 사용합니다. 이는 자원을 정리하거나, 중요한 후처리 작업을 수행하는 데 유용합니다.

try {
  // 에러가 발생할 수 있는 코드
} catch (error) {
  // 에러 처리 코드
} finally {
  // 에러 발생 여부와 상관없이 실행될 코드
  console.log("finally 절은 항상 실행됩니다.");
}

에러 던지기 (Throwing Errors)

특정 조건에서 프로그램이 에러를 발생시키도록 강제할 수 있습니다. 이를 위해 throw 키워드를 사용하며, 던져진 에러는 가장 가까운 catch 블록에 의해 처리됩니다.

function checkNumber(num) {
  if (isNaN(num)) {
    throw new Error("입력값은 숫자여야 합니다.");
  }
  console.log("Valid number:", num);
}

try {
  checkNumber("not a number");
} catch (error) {
  console.error(error.message);
}

비동기 에러 처리

비동기 코드에서의 에러 처리는 조금 다른 접근이 필요합니다. 프로미스를 사용하는 경우, .catch() 메서드를 사용해 비동기 작업에서 발생하는 에러를 처리할 수 있습니다.

javascriptCopy code
fetch("<https://nonexistent.url>")
  .then(response => response.json())
  .catch(error => console.error("Fetch error:", error));

**async/await**를 사용하는 경우, 비동기 함수 호출을 try...catch 문으로 감싸서 에러를 처리할 수 있습니다.

async function fetchData() {
  try {
    const response = await fetch("<https://nonexistent.url>");
    const data = await response.json();
  } catch (error) {
    console.error("Async fetch error:", error);
  }
}

fetchData();

에러 처리는 프로그램의 안정성을 유지하고, 예기치 않은 상황에서 사용자에게 적절한 피드백을 제공하는 데 필수적입니다. 따라서 에러가 발생할 가능성이 있는 모든 곳에서 적절한 에러 처리 로직을 구현하는 것이 좋습니다.

728x90
반응형
LIST

'javascript > 모던 자바스크립트 Deep Dive' 카테고리의 다른 글

후기  (0) 2024.03.09
모듈(module)  (0) 2024.02.22
제너레이터 (Generators)와 async/await  (0) 2024.02.22
콜백 헬(Callback Hell)과 프로미스(Promises)  (0) 2024.02.21
REST API  (0) 2024.02.21