
에러가 발생했을때 에러를 잡아 어플리케이션이 강제종료되지 않고 catch문의 코드블록에 있는 코드가 수행되어 에러를 처리한다.
try {
// 실행할 코드들
} catch (error) {
// 에러를 처리하는 코드들
}
try {
console.log('hi');
hello;
console.log('How are you?');
} catch (err) {
console.log('변수 선언이 안된 에러 발생 ');
}
// 출력: 변수 선언이 안된 에러 발생
1)서버로 부터 잘못된 JSON파일을 디코딩할때 에러 발생시 try-catch문 사용
let json ="{name khw}"; // 잘못 전달된 JSON파일
try {
let user = JSON.parse(json);
console.log(user.name); // 에러 발생
} catch (err) {
console.log(err.name); // SyntaxError
console.log(err.message);
// Expected property name or '}' in JSON at position 1
}
2)제대로 된 JSON파일을 받았지만 parse로 객체화된 객체에 없는 프로퍼티를 가져올 경우
let json = '{ "age": 30 }';
try {
let user = JSON.parse(json); // 에러 없음
console.log( user.name ); // undefined
} catch (error) {
console.log( "실행되지 않습니다." );
}
에러 발생을 유발하지만 코드 자체에는 에러가 발생하지 않아 catch문으로 넘어가지 않는다.
3) ‘throw’ 연산자 사용
throw 연산자는 에러를 생성한다.
let json = '{ "age": 30 }';
try {
let user = JSON.parse(json); // <-- 에러 없음
if(!user.name){
throw new Error('name프로퍼티는 없다!');
}
console.log( user.name ); // undefined 지만 코드 자체에서 에러가 발생하지는 않음
} catch (error) {
console.log(error.name); // Error
console.log(error.message); // name프로퍼티는 없다!
}
try..catch는 finally라는 코드 절을 하나 더 가질 수 있다.
-finally안의 코드는 에러가 있든 없든 모든 상황에서 실행되는 코드이다.
예상치 못한 또 다른 에러가 try {...} 블록 안에서 발생 할 수도 있다.
let json = '{ "age": 30 }'; // 불완전한 데이터
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("불완전한 데이터: 이름 없음");
}
blabla(); // 예상치 못한 에러
console.log( user.name );
} catch(e) {
if (e instanceof SyntaxError) {
console.log( "JSON Error: " + e.message );
} else {
throw e; // 에러 다시 던지기 (*)
}
}
알 수 없는 에러는 건너뛰는 예제
function readData(){
let json = '{ "age": 30 }'; // 불완전한 데이터
try {
// ...
blabla(); // 에러(Reference Error)
} catch (e) {
// ...
if (!(e instanceof SyntaxError)) {
throw e; // 알 수 없는 에러 다시 던지기
}
}
}
try{
readData();
} catch(e){
console.log("에러를 잡았다! " + e);
// 에러를 잡았다! ReferenceError: blabla is not defined
}