해당 포스팅은 위키북스의 모던 자바스크립트 Deep Dive라는 책을 독학하며 기록하는 글입니다.
에러가 발생하지 않는 코드를 작성하는 것은 불가능하므로 항상 에러에 대해 대처할 수 있는 코드를 작성하는 것이 바람직하다.
에러 처릴를 할 수 있는 구문으로 대표적인 것은 try..catch...finally
문인데 사용법은 다음과 같다.
try {
// 에러가 일어날 수도 있는 작업들에 대한 코드
} catch(error) {
// 에러가 일어난다면 분기해서 실행될 코드들
} finally {
// 에러가 일어나든, 일어나지 않든 실행될 코드들
}
finally
문은 생략하고 catch
문까지만 작성해도 괜찮다. 다음 예제 코드를 보자.
try {
console.log(name);
} catch(error) {
console.log('출력하고자 하는 변수가 선언되지 않았습니다.');
}
해당 코드를 실행시키면 선언되지 않은 name
이라는 변수를 출력하려 했고, 이는 당연히 오류를 발생시키지만 오류를 발생시키고 비정상적으로 종료되는 것이 아니라 catch
문으로 분기하여 오류에 대해 설명하고 정상적으로 종료되게 된다.
위의 try..catch...finally
문에서 catch
문이 error
라는 매개변수명으로 무언가를 전달받는 것을 볼 수 있다. 이는 에러가 발생했을 때 에러에 대한 정보를 담고 있는 Error 객체
로 보통 매개변수명으로 error, err 등을 사용한다.
Error 객체는 사용자가 직접 만들 수도 있는데 이때 생성할 수 있는 Error 객체의 종류는 다음과 같다.
생성자 함수 | 만들어지는 Error 객체 |
---|---|
Error | 일반적인 에러 객체 |
SyntaxError | 자바스크립트 문법에 맞지 않는 문을 해석할 떄 발생하는 에러 객체 |
referenceError | 참조할 수 없는 식별자를 참조했을 때 발생하는 에러 객체 |
TypeError | 피연산자 또는 인수의 데이터 타입이 유효하지 않을 때 발생하는 에러 객체 |
RangeError | 숫자값의 허용 범위를 벗어났을 때 발생하는 에러 객체 |
URIError | endodeURI 또는 decodeURI 함수에 부적절한 인수를 전달했을 때 발생하는 에러 객체 |
EvalError | eval 함수에서 발생하는 에러 객체 |
const err = new Error();
new
키워드를 사용해서 Error 객체를 만든다고 해서 에러가 발생하는 것이 아니다. 말 그대로 Error 객체를 만들기만 하고 발생은 시킨 것이 아니기 때문에 에러를 발생시키기 위해서는 명시적으로 발생을 시켜줘야 한다.
throw err;
다음 코드는 일부러 try
문안에서 에러를 생성해서 바로 발생시키고 catch
문으로 분기하여 정상적으로 에러를 처리하는지를 보는 코드이다.
try {
throw new Error("에러 발생");
} catch(err) {
console.log(err); // "에러 발생"
}
마지막으로 Error는 항상 호출자 방향, 즉 실행 컨텍스트 스택에서 아래 방향으로 전파가 된다. 따라서 적절한 때에 에러를 캐치해주지 않으면 결과적으로 에러는 전역 실행 컨텍스트까지 전파될 것이고 이는 초기에 에러를 잡지 못한 것보다 큰 오류를 야기할 수 있기 때문에 항상 에러에 대한 처리를 염두해두고 코드를 짜는 것이 바람직하다.