JavaScript/모던 자바스크립트 딥다이브
[JS] 에러 처리
김춘삼씨의 고양이
2024. 10. 13. 10:00
📌 에러 처리의 필요성
- 에러나 예외적인 상황에 대응하지 않으면 프로그램은 강제 종료될 수 있음
- 작성한 코드에서 언제나 에러나 예외적인 상황이 발생할 수 있다는 것을 전제하고 이에 대응하는 코드를 작성하는 것이 필요함
📌 try ... catch ... finally 문
- try ... catch ... finally 문으로 에러 핸들링을 할 수 있음
- try ... catch ... finally 문을 실행하면 먼저 try 코드 블록이 실행되고, try 코드 블록에 포함된 문 중에서 에러 발생 시 발생한 에러는 catch 문의 err 변수에 전달되고 catch 코드 블록이 실행됨
- finally 코드 블록은 에러 발생과 상관없이 반드시 한 번 실행됨
try {
// 실행할 코드
} catch (err) {
// try 코드 블록에서 에러가 발생할 경우 이 코드 블록의 코드가 실행됨
// err에는 try 코드 블록에서 발생한 Error 객체가 전달됨
} finally {
// 에러 발생과 상관없이 반드시 한 번 실행됨
}
📌 Error 객체
- Error 생성자 함수는 에러 객체를 생성하고, Error 생성자 함수에는 에러를 상세히 설명하는 에러 메세지를 인수로 전달할 수 있음
- Error 생성자 함수가 생성한 에러 객체는 message 프로퍼티와 stack 프로퍼티를 가짐
message 프로퍼티: Error 생성자 함수에 인수로 전달한 에러 메세지
stack 프로퍼티: 에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열이며 디버깅 목적으로 사용함
const error = new Error('invalid');
생성자 함수 | 인스턴스 |
Error | 일반적인 에러 객체 |
SyntaxError | 자바스크립트 문법에 맞지 않는 문을 해석할 때 발생하는 에러 객체 |
ReferenceError | 참조할 수 없는 식별자를 참조했을 때 발생하는 에러 객체 |
TypeError | 피연산자 또는 인수의 데이터 타입이 유효하지 않을 때 발생하는 에러 객체 |
RangeError | 숫자값의 허용 범위를 벗어났을 때 발생하는 에러 객체 |
URIError | encodedURI 또는 decodedURI 함수에 부적절한 인수를 전달했을 때 발생하는 에러 객체 |
EvalError | eval 함수에서 발생하는 에러 객체 |
📌 throw 문
- 에러를 발생시키려면 try 코드 블록에서 throw 문으로 에러 객체를 던져야 함
- throw 문의 표현식은 어떤 값이라도 상관없지만 일반적으로 에러 객체를 지정함
- 에러를 던지면 catch 문의 에러 변수가 생성되고 던져진 에러 객체가 할당된 후 catch 코드 블록이 실행되기 시작함
try {
// 에러 객체를 던지면 catch 코드 블록이 실행되기 시작함
throw new Error('something wrong');
} catch (err) {
console.log(err); // Error: something wrong
}
📌 에러의 전파
- 에러는 호출자 방향으로 전파됨
(에러는 콜 스택의 아래 방향(실행 중인 실행 컨텍스트가 푸시되기 직전에 푸시된 실행 컨텍스트 방향)으로 전파됨) - throw된 에러를 캐치하지 않으면 호출자 방향으로 전파됨
- throw된 에러를 캐치하여 적절히 대응하면 프로그램을 강제 종료시키지 않고 코드의 실행 흐름을 복구할 수 있음
- 비동기 함수인 setTimeout이나 프로미스 후속 처리 메서드의 콜백 함수는 호출자가 존재하지 않기 때문에 주의해야 함
참고문헌 및 출처 : 모던 자바스크립트 Deep Dive (이웅모)