JS NORMAL | 예외처리 (Exception)

chaen·2024년 1월 30일
0

JS Grammar

목록 보기
27/28
post-thumbnail

❓ 예외 (Exception)

  • 프로그래밍에서 예외란, 실행 중인 프로그램에서 예상하지 못한 상황이 발생하여 더 진행이 불가능한 경우를 말한다.
  • 문법 오류, 파일이 사라짐, 변수가 선언되지 않음, 메모리 부족 등
  • 예외를 발생시키지 않는 것도 중요하지만, 예외가 발생했을 때 대처할 수 있는 방안을 마련해야 한다.

💻 예외 처리 (Exception Handling)

  • 오류가 발생했을 때 코드의 실행 흐름 복구 기능을 한다.
  • try ~ catch ~ finally 구문을 활용한다.
try {
  // 로직
} catch(err) {
  // 에러 발생 시 로직
} finally {
  // 무조건 실행되는 코드
}

try 구문

  • 에러가 발생 시 원상 복구를 시도하는 코드

catch

  • 에러 발생 시 코드 실행 흐름이 넘어 옴
  • 에러의 정보를 담고 있는 객체(e, err, erro 등 매개변수)를 사용한다.

error.property

error 객체는 일반적으로 Error 클래스의 인스턴스이다.
message를 포함해 몇 가지 자주 사용되는 속성은 다음과 같다.

  1. name
  • 에러의 이름 (기본적으로는 "Error")
const customError = new Error("Custom error message");
console.log(customError.name); // 출력: "Error"
  1. stack
  • 에러가 발생한 위치와 호출 스택 정보를 나타내는 문자열
  • 콜 스택을 보고 어디에서 에러가 났는지 알 수 있어 디버그에 유용하다.
try {
  throw new Error("Custom error message");
} catch (error) {
  console.log(error.stack);
}
  1. message
  • Error 객체가 생성될 때 전달된 문자열을 출력한다. 따라서 에러에 대한 사용자가 정의한 메시지를 확인할 수 있다.
try {
  throw new Error("This is an error message");
} catch (error) {
  console.log(error.message); // 출력: "This is an error message"
}
  1. toString() 메서드
  • Error 객체를 문자열로 변환하여 에러에 대한 정보를 포함한 문자열을 반환한다.
  • 에러의 이름, 메서지를 포함한 문자열 전체를 출력한다.
const customError = new Error("Custom error message");
console.log(customError.toString()); // 출력: "Error: Custom error message"

console.log(error) 만 출력할 경우, 브라우저 콘솔 또는 Node.js 콘솔에 따라 형식이 다를 수 있지만, 에러 객체 전체를 출력하여, 에러 이름, 메서지, 또는 스택 트레이스 정보까지도 출력 가능하다.
예시) Error: Custom error message at <anonymous>:x:y


finally

  • 에러 발생 여부와 관계 없이 무조건 try가 종료되면 실행되는 코드
  • return, break, continue등으로 코드의 실행 흐름이 즉시 이동되더라도 무조건 실행된다.
  • 에러가 안 났을 때: try - finally
  • 에러가 났을 때: try - 에러발생 - catch - finally

💻 예외 던지기 (throw)

  • 예외를 강제 발생 시켜 예외적인 상황을 알린다.
  • Error 생성자 함수와 throw를 이용한다.
function getSize(length) {
  if (typeof length !== 'number') {
    throw new Error('Parameter is not a number!');
  }
  return length;
}

try {
  getSize('a');
} catch (e) {
  console.error(e);
}

💻 다중 예외 처리하기

instanceof 사용하기

try {
  // ...
} catch (error) {
  if (error instanceof TypeError) {
    console.error("Caught a TypeError: " + error.message);
  } else if (error instanceof ReferenceError) {
    console.error("Caught a ReferenceError: " + error.message);
  } else if (error instanceof SyntaxError) {
    console.error("Caught a SyntaxError: " + error.message);
  } else if (error instanceof RangeError) {
    console.error("Caught a RangeError: " + error.message);
  } else {
    console.error("Caught an unexpected error: " + error);
  }
}

error.name 사용하기

try {
  // ...
} catch (error) {
  if (error.name === "ReferenceError") {
    // 참조 에러일 경우의 처리
  } else if (error.name === "SyntaxError") {
    // 구문 에러일 경우의 처리
  } else if (error.name === "TypeError") {
    // 타입 에러일 경우의 처리
  } else {
    // 그 외의 에러일 경우의 처리
  }
}

💻 커스텀 예외 만들기

Error 클래스를 상속받는 형식으로 구현 가능하다.

// 사용자 정의 예외 타입
class MyError extends Error { // Error 부모 클래스를 상속한다.
  constructor(message) {
    super(message); //MyError의 this가 Error의 객체 this 호출 -> Error의 생성자를 작동시킴
    this.name = 'MyError';
  }
}

try {
  throw new MyError('Something went wrong');
} catch (error) {
  // 에러 객체를 받아서 처리
  if (error.name === "MyError") {
	console.log(error.message); // 'Something went wrong'
  }
}

settimeout, promise의 예외 처리 더 공부하기/ 참고: https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC

0개의 댓글