[modern JS Deep Dive] - 47장 . 에러 처리

유선향·2025년 1월 18일
0

<modern_JS_Deep_Dive>

목록 보기
42/44

에러 처리의 필요성

  • 에러가 발생하지 않는 코드를 작성하는 것은 불가능 하다
  • 작성한 코드에서는 언제나 에러나 예외적인 상황이 발생할 수 있다는 것을 전제하고 이에 대응하는 코드를 작성하는 것이 중요하다.

에러 처리를 구현하는 방법

  1. 예외적인 상황이 발생하면 반환하는 값 (null or -1)을 if문이나 단축 평가 또는 옵셔널 체이닝 연산자를 통해 확인해서 처리하는 방법
  2. 에러 처리 코드를 미리 등록해 두고 에러가 발생하면 에러 처리 코드로 점프 하도록 하는 방법
    1. try catchans

try …catch … finally 문

  • try …catch … finally 문 으로 에러를 처리하면 프로그램이 강제 종료되지 않는다.
  • try 코드블록이 먼저 실행되고, 실행중에 에러가 발생하면 catch 문의 err 변수에 전달되고 catch 코드 블록이 실행된다.
try {
...
} catch (err) {
...
} finally {
...
}

Error 객체

Error 생성자 함수는 에러 객체를 생성한다.
Error 생성자 함수에는 에러를 상세히 설명하는 에러 메시지를 인수로 전달할 수 있다.

const error = new Error('message')
  • Error 생성자 함수가 생성한 에러 객체는 message 프로퍼티와 stack 프로퍼티를 갖는다.
  • message 프로퍼티 : Error 생성자 함수에 인수로 전달한 에러 메시지
  • stack 프로퍼티 : 에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열이며 디버깅 목적으로 사용

7가지 에러 객체 생성자 함수

  • 아래 에러 생성자 함수가 생성한 에러 객체의 프로토타입은 모두 Error.prototype을 상속받는다.

throw 문

  • Error 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것은 아니다.
  • 에러 객체 생성 ≠에러 발생

throw 표현식


에러의 전파

  • 에러는 호출자 방향으로 전파된다.
    • 콜 스택의 아래 방향 현재 실행 컨텍스트의 직전에 푸시된 실행 컨텍스트 방향
    • throw 된 에러를 캐치 하지 않으면 호출자 방향으로 전파 되므로, 호출자 에서 throw 에러를 캐치해야한다.
  • 비동기 함수인 setTimeout or 프로미스 후속 처리 메서드의 콜백 함수는 호출자가 없다.
    • setTimeout , 프로미스 후속 처리 메서드의 콜백 함수는 태스크 큐나 마이크로 태스크 큐에 일시 저장되었다가 콜 스택이 비면 이벤트 루프에 의해 콜 스택으로 푸시되어 실행되기 때문에, 에러를 전파할 호출자가 존재하지 않는다.
    • Promise 체인 내부에서는 .catch() 를 붙이기
      Promise.resolve()
        .then(() => {
          throw new Error('then 안에서 에러!')
        })
        .catch((e) => console.log('여기서 잡힘:', e.message))
      
    • setTimeout 안에서는 try/catch를 내부에 작성
      setTimeout(() => {
        try {
          throw new Error('타이머 내부 에러!')
        } catch (e) {
          console.log('여기서 잡힘:', e.message)
        }
      }, 0)
      

0개의 댓글