에러가 발생하면 스크립트는 즉시 중단되고 console
에 에러가 출력된다.
try...catch
문법으로 에러를 잡아서 스크립트가 죽는걸 방지할 수 있다.
try {
// 코드
} catch(err) {
// 에러 핸들링
}
try {}
안의 코드가 실행된다.- 에러가 없다면,
try {}
안의 마지막 줄까지 실행되고,catch
블록은 건너뛴다.- 에러가 있다면,
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
}
잘못된 형식의 JSON
이 들어왔을 때, JSON.parse()
는 에러를 만들기 때문에 스크립트가 중단된다.
try...catch
를 사용해 에러를 처리해보자.
let json = '{"name":"John", "age": 30}';
let user = JSON.parse(json);
alert(user.name); // John
alert(user.age); // 30
- 서버로부터 전달받은 데이터
- 전달받은
JSON
문자열을JavaScript
객체로 변환- 문자열 형태로 전달받은
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);
}
JSON.parse()
에서 에러가 발생try
안 코드가 즉시 중단catch
문으로 넘어감
문법적으로 잘못되지 않았지만, 불완전한 데이터로 에러가 발생하는 상황
let json = '{ "age": 30 }';
try {
let user = JSON.parse(json);
alert( user.name ); // undefined
} catch (e) {
alert( "실행되지 않습니다." );
}
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 );
}
- 불완전한 데이터
JSON.parse()
에서는 에러가 없다.name
이 없으면 에러가 발생한 것으로 간주하고 에러 객체를 생성try
가 즉시 중단되고catch
로 넘어간다.alert
창에JSON Error: 불완전한 데이터: 이름 없음
출력