에러 처리의 필요성
코드에서 발생 가능한 에러를 적절히 대처하지 않으면 코드가 실행 중에 강제 종료될 수 있다.
- 강제 종료: 에러가 발생한 라인이 마치 'return'된 것처럼 이후 코드 라인을 더 이상 실행하지 않는 것
예외(Exception)
직접적으로 에러가 발생했다고는 볼 수 없지만 적절히 대응하지 않으면 에러로 이어지는 상황
- 예: document.querySelector로 선택한 DOM이 null일 때
- 에러는 아니기 때문에 다음 라인 실행이 되지만 이 라인을 실행하면서 이전에 반환한 null 값으로 인해 에러 발생 가능
const $button = document.querySelector('button');
$button.classList.add('disabled');
- 예외 해결법 3가지: if문으로 확인, 단축 평가, 옵셔널 체이닝 연산자
try... catch... finally문 (에러 핸들링)
- 에러를 처리하는 코드(catch 문)를 미리 등록해두고 try 문에서 에러가 발생하면 에러 처리 코드로 점프
- finally 문은 생략 가능
- catch 문도 생략은 가능하지만 catch가 없는 try 문은 의미가 없기 때문에 보통 생략하지 않는다.
- 작동 방법
- try 문 실행 중 에러 발생 시 catch 문에서 err(변수명 상관 없음) 변수를 생성하고 try 문에서 발생한 에러 객체를 err 변수에 할당
- 이후 catch 문을 실행하여 에러를 처리
- finally가 있으면 에러 발생(으로 인한 catch 실행 여부와 상관 없이) finally 문 내의 코드 블록을 마지막에 반드시 한 번 실행
Error 객체
- Error 생성자 함수(new Error)로 에러 객체 생성
- 에러를 설명하는 에러 메시지를 인수로 전달 가능
const error = new Error('invalid');
- 생성된 에러 객체의 프로퍼티
- message: new Error에 인수로 전달한 에러 메시지
- stack: 에러를 발생시킨 콜 스택의 호출 정보 문자열 (디버깅에 사용됨)
자바스크립트의 7가지 Error 생성자 함수
- Error: 일반 에러
- SyntaxError: 문법 에러
- ReferenceError: 참조 에러
- TypeError: 타입 에러
- RangeError: 숫자 범위 에러
- URIError: URI에 부적절한 인수 전달 시
- EvalError: eval 함수 에러
throw 문
- Error 생성자 함수는 에러 객체를 '생성'하는 역할만 한다.
- 생성한 에러 객체로 에러를 '발생'시키려면 throw 문으로 에러를 던져야 한다.
try {
throw new Error('Something is wrong');
} catch(err) {
console.log(err);
}
- 에러를 던지면 catch 문의 에러 변수가 생성되고 던져진 에러 객체가 할당
- 이후 catch 문 실행