에러 처리의 필요성
- 에러가 발생하지 않는 코드를 작성하는 것은 불가능 하다
- 작성한 코드에서는 언제나 에러나 예외적인 상황이 발생할 수 있다는 것을 전제하고 이에 대응하는 코드를 작성하는 것이 중요하다.
에러 처리를 구현하는 방법
- 예외적인 상황이 발생하면 반환하는 값 (null or -1)을 if문이나 단축 평가 또는 옵셔널 체이닝 연산자를 통해 확인해서 처리하는 방법
- 에러 처리 코드를 미리 등록해 두고 에러가 발생하면 에러 처리 코드로 점프 하도록 하는 방법
- try catchans
try …catch … finally 문
- try …catch … finally 문 으로 에러를 처리하면 프로그램이 강제 종료되지 않는다.
- try 코드블록이 먼저 실행되고, 실행중에 에러가 발생하면 catch 문의 err 변수에 전달되고 catch 코드 블록이 실행된다.
try {
...
} catch (err) {
...
} finally {
...
}
Error 객체
Error 생성자 함수는 에러 객체를 생성한다.
Error 생성자 함수에는 에러를 상세히 설명하는 에러 메시지를 인수로 전달할 수 있다.
const error = new Error('message')
- Error 생성자 함수가 생성한 에러 객체는 message 프로퍼티와 stack 프로퍼티를 갖는다.
- message 프로퍼티 : Error 생성자 함수에 인수로 전달한 에러 메시지
- stack 프로퍼티 : 에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열이며 디버깅 목적으로 사용
7가지 에러 객체 생성자 함수
- 아래 에러 생성자 함수가 생성한 에러 객체의 프로토타입은 모두 Error.prototype을 상속받는다.

throw 문
- Error 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것은 아니다.
- 에러 객체 생성 ≠에러 발생
throw 표현식
에러의 전파
- 에러는 호출자 방향으로 전파된다.
- ⇒ 콜 스택의 아래 방향 현재 실행 컨텍스트의 직전에 푸시된 실행 컨텍스트 방향
- throw 된 에러를 캐치 하지 않으면 호출자 방향으로 전파 되므로, 호출자 에서 throw 에러를 캐치해야한다.
- 비동기 함수인 setTimeout or 프로미스 후속 처리 메서드의 콜백 함수는 호출자가 없다.
- setTimeout , 프로미스 후속 처리 메서드의 콜백 함수는 태스크 큐나 마이크로 태스크 큐에 일시 저장되었다가 콜 스택이 비면 이벤트 루프에 의해 콜 스택으로 푸시되어 실행되기 때문에, 에러를 전파할 호출자가 존재하지 않는다.
- Promise 체인 내부에서는
.catch() 를 붙이기Promise.resolve()
.then(() => {
throw new Error('then 안에서 에러!')
})
.catch((e) => console.log('여기서 잡힘:', e.message))
- setTimeout 안에서는 try/catch를 내부에 작성
setTimeout(() => {
try {
throw new Error('타이머 내부 에러!')
} catch (e) {
console.log('여기서 잡힘:', e.message)
}
}, 0)