JavaScript/JavaScript 문법

[JavaScript]try-catch로 잡을 수 없는 예외

DevStory 2021. 12. 20.

대부분의 개발자들은 애플리케이션이 에러로 인해 중단되는 것을 방지하기 위해 습관적으로 try-catch문을 작성합니다. 하지만 JavaScript에서는 try-catch문으로 잡을 수 없는 예외가 존재합니다.

 

이번 포스팅에서는 JavaScript에서 try-catch문으로 잡을 수 없는 예외가 무엇인지 설명합니다.

 


구문 오류(SyntaxError)

구문 오류(SyntaxError)는 코드가 실행 중이 아니라 구문이 분석되는 동안 발생하는 에러입니다. 그러므로 try-catch문으로 구문 오류를 처리할 수 없습니다.

 

다음은 구문 오류(SyntaxError)를 catch 못하는 예제입니다.

errorFunc = function() {
  try {
    a.[];
  } catch(e) {
    console.log('error : ' + e);
  }
}

errorFunc();

실행 결과

a.[]는 유효한 구문이 아니므로 구문 분석 단계에서 예외가 발생합니다.


비동기 코드에서 예외

다음 코드의 try-catch문은 setTimeout() 함수의 콜백 함수가 호출될 때 종료되므로 비동기식 콜백 함수에서 발생한 예외를 catch 할 수 없습니다.

errorFunc = function() {
  try {     
    setTimeout(()=>{ 
      throw new Error('비동기 오류'); 
    }, 1000) 
  } catch(e) { 
    console.log('오류: ', e); 
  }
}

errorFunc();

실행 결과

 

setTimeout() 함수의 콜백 함수에서 발생한 예외를 catch 하기 위해서는 setTimeout() 함수 내부에 try-catch문을 작성합니다.

errorFunc = function() {
  setTimeout(()=>{ 
    try {
      throw new Error('비동기 오류');   
    } catch(e) { 
      console.log('오류: ', e); 
    }
  }, 1000)
}

errorFunc();

실행 결과


Promise 예외

Promise 객체 내에서 발생한 모든 동기 또는 비동기 예외는 Promise 객체 내부의 Promise.prototype.catch로 catch 됩니다. Promise 객체 외부에서는 Promise 객체 내에서 발생한 예외를 catch 할 수 없습니다.

 

▶ try-catch문으로 catch 못하는 예제 1

errorFunc = function() {
  try {
    new Promise((resolve, reject) => { 
      throw new Error('Promise 오류') 
    })
  } catch(e) {
    console.log('오류', e);
  }
}

errorFunc();

 

▶ try-catch문으로 catch 못하는 예제 2

errorFunc = function() {
  try {
    new Promise((resolve, reject) => { 
      setTimeout(() => { 
        throw new Error('Promise 오류') 
      }, 1000) 
    }) 
  } catch(e) {
    console.log('오류', e);
  }
}

errorFunc();

 

▶ Promise 객체 내부의 catch문 사용

errorFunc = function() {
  try {
    new Promise((resolve, reject) => { 
      throw new Error('Promise 오류') 
    }).catch((error) => {
      console.log('Promise 오류', error);
    })
  } catch(e) {
    console.log('오류', e);
  }
}

errorFunc();

실행 결과

반응형

댓글