우리가 만든 프로그램은 에러가 발생하면 스크립트가 죽고(=즉시 중단), 콘솔에 에러가 출력된다.
이때 try catch 를 사용해서 에러를 잡는다면(catch) 스크립트가 죽는 걸 막고, 에러를 잡아 다른 행동을 할 수 있다.(다시 입력하라고 알려준다던지)
try, catch 라는 두 개의 주요 블럭으로 구성된다.
try {
// 코드
} catch (err) {
// 에러 핸들링
}
try 에서 에러가 발생해도 catch 에서 에러를 처리하기 때문에 스크립트가 죽지 않는 것!
에러가 발생하면 자바스크립트는 에러 내용이 담긴 객체를 생성한다. 그리고 catch 블럭에 이 객체를 인수로 전달한다. (앞에서 말한 err)
try {
} catch (err) { // <-- 에러 객체로 err대신 다른 이름을 사용할 수 있다.
}
이 에러 객체는 여러개의 프로퍼티를 갖는다.
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에서 (프로퍼티 받는 부분)을 삭제하고 사용해도 된다.
catch {
}
비동기 코드에서 발생한 에러는 try catch 에서 잡을 수 없다.
따라서 다른 방법을 사용해서 에러 핸들링을 해야한다.
try catch로 비동기 함수를 감싸는 것이 아닌, 비동기 함수가 try catch를 감싸는 형태가 되어야 에러핸들링을 할 수 있다.
비동기 함수 () {
try {
// 문제 코드
} catch {
alert('에러를 잡았습니다.');
}
}
// 위와 같은 형태로 작성해야하며, 아래와 같은 형태로 작성하면 에러 핸들링을 하지 못한다.
try {
비동기 함수(); // 비동기 함수의 내부가 아닌 바깥에 try catch 작성함
} catch (err) {
}
사실 에러핸들링은 try catch가 끝이 아니다.
try catch는 finally라는 코드 블럭을 하나 더 가질 수 있다.
finally는 무언가를 실행하고, 실행 결과에 상관없이 실행을 완료하고 싶을 경우 사용된다.
이 블럭 내부의 코드는 아래와 같은 상황에서 실행된다.
try {
// 코드
} catch(e) {
// 에러 핸들링
} finally {
// 항상 실행
}