'try..catch'와 에러 핸들링

에러가 발생하면 프로그램이 죽는다.

‘try…catch’ 문법

try {

  // 코드...

} catch (err) {

  // 에러 핸들링

}

일반적으로 try {...} 안의 코드가 실행된다. 에러가 없다면, try가 실행된 이후 catch는 실행되지 않는다. 에러가 있다면, try 안 코드의 실행이 중단되고, catch(err)가 실행된다.

try..catch는 오직 런타임 에러에만 잡는다.

즉 일단 실행은 되어야 한다. 실행되 않는 컴파일 에러(대체로 문법 에러)는 잡지 않는다.

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

try..catch는 동기적으로 동작한다.

일반적인 스크립트와 동일하게 동작한다. 만약 비동기식을 사용한 경우, 해당 비동기식 내에서 처리를 해야만 한다. (콜백을 try_catch로 감싸기)

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

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

에러 객체

에러 발생시 catch의 인수로 에러 객체를 받아 사용할 수 있다.

name 에러 이름. 정의되지 않은 변수 때문에 발생한 에러라면 "ReferenceError"가 이름이 된다 message 에러 상세 내용을 담고 있는 문자 메시지

stack 에러를 유발한 중첩 호출들의 순서 정보를 가진 문자열. 표준은 아니다.

try {
  lalala; // 에러, 변수가 정의되지 않음!
} catch(err) {
  alert(err.name); // ReferenceError
  alert(err.message); // lalala is not defined
  alert(err.stack); // ReferenceError: lalala is not defined at ... (호출 스택)

  // 에러 전체를 보여줄 수도 있습니다.
  // 이때, 에러 객체는 "name: message" 형태의 문자열로 변환됩니다.
  alert(err); // ReferenceError: lalala is not defined
}

선택적 ‘catch’ 바인딩