try...catch

.esc·2021년 2월 28일
0

try...catch

에러가 발생하면 스크립트는 즉시 중단되고 console에 에러가 출력된다.
try...catch 문법으로 에러를 잡아서 스크립트가 죽는걸 방지할 수 있다.

동작 알고리즘

try {
  // 코드
} catch(err) {
  // 에러 핸들링
}
  1. try {} 안의 코드가 실행된다.
  2. 에러가 없다면, try {} 안의 마지막 줄까지 실행되고, catch 블록은 건너뛴다.
  3. 에러가 있다면, try {} 안의 실행이 중단되고, catch(err) 블록으로 제어 흐름이 넘어간다.
    변수 err는 무슨 일이 일어났는지에 대한 설명이 담긴 객체를 포함한다.

유효한 코드의 에러만 처리

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

try...catch는 실행 가능한 유효한 자바스크립트 코드에서 발생하는 에러만 처리할 수 있다.
이런 에러를 '런타임 에러(runtime error)' 또는 '예외(exception)이라고 한다.

동기적

try {
  setTimeout(function() {
    noSuchVariable; // 스크립트는 여기서 죽음
  }, 1000);
} catch (err) {
  alert( "작동 멈춤" ); // 실행안됨
}

setTimeout에 넘겨진 익명함수는 try...catch를 떠난 다음에 실행되기 때문에 에러를 잡을 수 없다.

setTimeout(function() {
  try {
    noSuchVariable;
  } catch {
    alert( "에러를 잡았습니다!" ); // 에러를 잡음
  }
}, 1000);

에러 객체

에러가 발생하면 자바스크립트는 에러 상세내용이 담긴 객체를 생성한다. 그 후 catch 블록에 이 객체를 인수로 전달한다.

try {
  // 코드
} catch(err) { // 에러객체 'err'
  // 에러 핸들링
}

주요 프로퍼티

  • name
    에러 이름. 정의되지 않은 변수 때문에 발생한 에러라면 ReferenceError가 이름이 된다.

  • message
    에러 상세 내용을 담고 있는 텍스트 메시지

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

try...catch 사용

잘못된 형식의 JSON이 들어왔을 때, JSON.parse()는 에러를 만들기 때문에 스크립트가 중단된다.
try...catch를 사용해 에러를 처리해보자.

  • 정상 코드
let json = '{"name":"John", "age": 30}';
let user = JSON.parse(json);
alert(user.name); // John
alert(user.age);  // 30
  1. 서버로부터 전달받은 데이터
  2. 전달받은 JSON 문자열을 JavaScript 객체로 변환
  3. 문자열 형태로 전달받은 user가 프로퍼티를 가진 객체가 됨
  • 에러 발생
let json = "{ bad json }";
try {
  let user = JSON.parse(json);
  alert( user.name ); // 동작하지 않음
} catch (err) {
  alert( "데이터에 에러가 있어 재요청을 시도합니다." );
  console.log(err.name);
  console.log(err.message);
}
  1. JSON.parse()에서 에러가 발생
  2. try 안 코드가 즉시 중단
  3. catch 문으로 넘어감

에러를 만들어 던지기

문법적으로 잘못되지 않았지만, 불완전한 데이터로 에러가 발생하는 상황

let json = '{ "age": 30 }';
try {
  let user = JSON.parse(json);
  alert( user.name ); // undefined
} catch (e) {
  alert( "실행되지 않습니다." );
}

throw 연산자

throw 연산자로 Error 객체를 생성하여 에러를 처리할 수 있다.

let json = '{ "age": 30 }';
try {
  let user = JSON.parse(json);
  if (!user.name) {
    throw new Error("불완전한 데이터: 이름 없음");
  }
  alert( user.name ); // 실행되지 않음
} catch(e) {
  alert( "JSON Error: " + e.message );
}
  1. 불완전한 데이터
  2. JSON.parse() 에서는 에러가 없다.
  3. name이 없으면 에러가 발생한 것으로 간주하고 에러 객체를 생성
  4. try가 즉시 중단되고 catch로 넘어간다.
  5. alert 창에 JSON Error: 불완전한 데이터: 이름 없음 출력

참조

https://ko.javascript.info/try-catch

profile
front-end

0개의 댓글