해당 포스팅은 위키북스의 모던 자바스크립트 Deep Dive라는 책을 독학하며 기록하는 글입니다.

에러가 발생하지 않는 코드를 작성하는 것은 불가능하므로 항상 에러에 대해 대처할 수 있는 코드를 작성하는 것이 바람직하다.

try..catch...finally

에러 처릴를 할 수 있는 구문으로 대표적인 것은 try..catch...finally 문인데 사용법은 다음과 같다.

try {
  // 에러가 일어날 수도 있는 작업들에 대한 코드
} catch(error) {
  // 에러가 일어난다면 분기해서 실행될 코드들
} finally {
  // 에러가 일어나든, 일어나지 않든 실행될 코드들
}

finally 문은 생략하고 catch 문까지만 작성해도 괜찮다. 다음 예제 코드를 보자.

try {
  console.log(name);
} catch(error) {
  console.log('출력하고자 하는 변수가 선언되지 않았습니다.');
}

해당 코드를 실행시키면 선언되지 않은 name 이라는 변수를 출력하려 했고, 이는 당연히 오류를 발생시키지만 오류를 발생시키고 비정상적으로 종료되는 것이 아니라 catch 문으로 분기하여 오류에 대해 설명하고 정상적으로 종료되게 된다.

Error 객체

위의 try..catch...finally 문에서 catch 문이 error라는 매개변수명으로 무언가를 전달받는 것을 볼 수 있다. 이는 에러가 발생했을 때 에러에 대한 정보를 담고 있는 Error 객체로 보통 매개변수명으로 error, err 등을 사용한다.

Error 객체는 사용자가 직접 만들 수도 있는데 이때 생성할 수 있는 Error 객체의 종류는 다음과 같다.

생성자 함수만들어지는 Error 객체
Error일반적인 에러 객체
SyntaxError자바스크립트 문법에 맞지 않는 문을 해석할 떄 발생하는 에러 객체
referenceError참조할 수 없는 식별자를 참조했을 때 발생하는 에러 객체
TypeError피연산자 또는 인수의 데이터 타입이 유효하지 않을 때 발생하는 에러 객체
RangeError숫자값의 허용 범위를 벗어났을 때 발생하는 에러 객체
URIErrorendodeURI 또는 decodeURI 함수에 부적절한 인수를 전달했을 때 발생하는 에러 객체
EvalErroreval 함수에서 발생하는 에러 객체

Error 객체 생성

const err = new Error();

Error 발생

new 키워드를 사용해서 Error 객체를 만든다고 해서 에러가 발생하는 것이 아니다. 말 그대로 Error 객체를 만들기만 하고 발생은 시킨 것이 아니기 때문에 에러를 발생시키기 위해서는 명시적으로 발생을 시켜줘야 한다.

throw err;

다음 코드는 일부러 try 문안에서 에러를 생성해서 바로 발생시키고 catch 문으로 분기하여 정상적으로 에러를 처리하는지를 보는 코드이다.

try {
  throw new Error("에러 발생");
} catch(err) {
  console.log(err);  // "에러 발생"
}

Error 전파

마지막으로 Error는 항상 호출자 방향, 즉 실행 컨텍스트 스택에서 아래 방향으로 전파가 된다. 따라서 적절한 때에 에러를 캐치해주지 않으면 결과적으로 에러는 전역 실행 컨텍스트까지 전파될 것이고 이는 초기에 에러를 잡지 못한 것보다 큰 오류를 야기할 수 있기 때문에 항상 에러에 대한 처리를 염두해두고 코드를 짜는 것이 바람직하다.

profile
I Will be Relaxed Person

0개의 댓글