[자바스크립트]

[JavaScript/DeepDive]47.에러처리

ki7348 2021. 6. 30. 20:55
  • [47.1] 에러 처리의 필요성
  • try ... catch 문을 사용해 발생한 에러에 적절하게 대응하면 프로그램이 강제 종료되지 않고 계속해서 코드를 실행시킬 수 있다.
    • console.log('[Start]');

      try {
           foo( );
      } catch (error) {
           console.error('[에러 발생]', error);
           // [에러 발생] ReferenceError: foo is not defined
      }

      // 발생한 에러에 적절한 대응을 하면 프로그램이 강제 종료되지 않는다.
      console.log('[End]');

 

 

 

  • [47.2] try ... catch ... finally 문
  • try ... catch ... finally 문은 다음과 같이 3개의 코드 블록으로 구성된다.
  • finally 문은 불필요하다면 생략 가능하다.
  • catch 문도 생략 가능하지만 catch 문이 없는 try 문은 의미가 없으므로 생략하지 않는다.
    • try {
           // 실행할 코드(에러가 발생할 가능성이 있는 코드)
      } catch(err) {
           // try 코드 블록에서 에러가 발생하면 이 코드 블록의 코드가 실행된다.
           // err에는 try 코드 블록에서 발생한 Error 객체가 전달된다.
      } finally {
           // 에러 발생과 상관없이 반드시 한 번 실행된다.
      }
  • try ... catch ... finally 문을 실행하면 먼저 try 코드 블록이 실행된다.
  • 이때 try 코드 블록에 포함된 문 중에서 에러가 발생하면 발생한 에러는 catch 문의 err 변수에 전달되고 catch 코드 블록이 실행된다.
  • catch문의 err 변수는 try 코드 블록에 포함된 문 중에서 에러가 발생하면 생성되고 catch 코드 블록에서만 유효하다.
  • finally 코드 블록은 에러 발생과 상관없이 반드시 한 번 실행된다.

 

 

 

  • [47.3] Error 객체
  • Error 생성자 함수에는 에러를 상세히 설명하는 에러 메세지를 인수로 전달할 수 있다.
    • const error = new Error('invalid');
  • Error 생성자 함수가 생성한 에러 객체는 message 프로퍼티와 stack 프로퍼티를 갖는다.
  • message 프로퍼티의 값은 Error 생성자 함수에 인수로 전달한 에러 메세지이고, stack 프로퍼티의 값은 에러를 발생시킨 콜스택의 호출 정보를 나타내는 문자열이며 디버깅 목적으로 사용한다.

 

 

 

  • [47.4] throw 문
  • Error 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것은 아니다. 
    • 즉, 에러 객체 생성과 에러 발생은 의미가 다르다.
  • 에러를 발생ㅅ기키려면 try 코드 블록에서 throw 문으로 에러 객체를 던져야 한다.
    • throw 표현식;
  • throw 문의 표현식은 어떤 값이라도 상관없지만 일반적으로 에러 객체를 지정한다.
  • 에러를 던지면 catch 문의 에러 변수가 생성되고 던져진 에러 객체가 할당된다.
  • 그리고 catch 코드 블록이 실행되기 시작한다.
    • try{
           // 에러 객체를 던지면 catch 코드 블록이 실행되기 시작한다.
           throw new Error('something wrong');
      } catch(error) {
            console.log(error);
      }

 

 

  • [47.5] 에러의 전파
  • thow된 에러를 캐치하지 않으면 호출자 방향으로 전파된다.
  • throw된 에러를 어디에서도 캐치하지 않으면 프로그램은 강제 종료된다.
  • 주의할 것은 비동기 함수인 setTimeout이나 프로미스 후속 처리 메서드의 콜백 함수는 호출자가 없다는 것이다.
    • 따라서 에러를 전파할 호출자가 존재하지 않는다.