try…catch 문법

try {
	// put your code...
} catch (err) {
	// put your error handle code...
}

*try…catch 동작 알고리즘은 다음과 같습니다.*

  1. 먼저 try {…} 안의 코드가 실행됩니다.
  2. 에러가 없다면, try 안의 마지막 줄까지 실행되고, catch 블록은 건너뜁니다.
  3. 에러가 있다면, try 안의 코드의 실행이 중된되고, catch(err) 블록으로 제어 흐름이 넘어갑니다. 변수 err(아무 이름이나 사용 가능)는 무슨 일이 일어났는지에 대한 설명이 담긴 에러 객체를 포함합니다.

이렇게 try {…} 블록 안에서 에러가 발생해도 catch 에서 에러를 처리하기 때문에 스크립트는 죽지 않습니다.

주의할 점

<aside> 💡

*[ try…catch 는 오직 런타임 에러에만 동작합니다. ] try…catch 는 실행 가능한(runable) 코드에만 동작합니다. 실행 가능한 코드는 유효한 JavaScript 코드를 의미합니다.

JavaScript 엔진은 코드를 읽고 난 후 코드를 실행합니다. 코드를 읽는 중에 발생하는 에러는 ‘parse-time 에러’ 라고 부르는데, 엔진은 이 코드를 이해할 수 없기 때문에 parse-time 에러는 코드 안에서 복구가 불가능합니다.

try..catch 는 유효한 코드에서 발생하는 에러만 처리할수 있습니다. 이런 에러를 ‘런타임 에러(runtime error)’ 혹은 ‘예외(Exception)’ 라고 부릅니다.*

</aside>

try {
  {{{{{{{{{{{{
} catch(e) {
  alert("유효하지 않은 코드이기 때문에, 자바스크립트 엔진은 이 코드를 이해할 수 없습니다.");
}

<aside> 💡

*[ try..catch 는 동기적으로 동작합니다. ] setTimeout 처럼 ‘스케줄 된(scheduled)’ 코드에서 발생한 예외는 try..catch 에서 잡아낼 수 없습니다.

setTimeout에 넘겨진 익명 함수는 엔진이 try..catch 를 떠난 다음에서야 실행되기 때문입니다. 스케줄 된 함수 내부의 예외를 잡으려면, try..catch 를 반드시 함수 내부에 구현해야 합니다.*

</aside>

// do not! 💩
try {
  setTimeout(function() {
    noSuchVariable; // 스크립트는 여기서 죽습니다.
  }, 1000);
} catch (e) {
  alert( "작동 멈춤" );
}

// try this! ✨
setTimeout(function() {
  try {
    noSuchVariable; // 이제 try..catch에서 에러를 핸들링 할 수 있습니다!
  } catch {
    alert( "에러를 잡았습니다!" );
  }
}, 1000);

에러 객체

에러가 발생하면 JavaScript는 에러 상세내용이 담긴 객체를 생성합니다. 그 후, catch 블록에 이 객체를 인수로 전달합니다.

try {
	// ...
} catch (err) { // <-- '에러 객체', err 대신 다른 이름으로도 쓸 수 있음
	// ...
}