에러처리
47
에러 처리
47.1 에러 처리의 필요성
에러가 발생하지 않는 코드는 없다.
try ...catch문을 사용해 발생한 에러에 적절하게
대응하면 프로그램이 강제 계속해서 코드를 실행시킬 수 있다.
직접적으로 에러를 발생하지 않는 예외적인 상황이 발생할 수 있다. 적절하게 대응하지 않으면 에러로
이어질 가능성이 있다.
const $button = document.querySelector("button");
$button.classList.add('disabled');
여기서 button이 존재하지 않을때 발생하는 문제들.
$button?.classList.add('disabled');
이때 $button?.classList.add('disabled');
전달한 css선택자 문자열로 요소 노드를 찾을 수 없는경우 에러를 발생하지 않고 null반환 이때 옵셔널 체이닝 연산자 ?.를 사용하지 않으면 에러로 이어질 수 있다.
47.2 try ... catch ... finally 문
기본적으로 에러 처리를 구현하는 방법은 크게 두가지
null처리를 통해 단축 평가 또는 옵셔널 체이닝 연산자를통해 확인한다.
finally는 생략 가능하지만 catch는 없다면 필요가 없음.
47.3 Error객체
Error 생성자 함수가 생성한 에러 객체는 message 프로퍼티와 stack 프로퍼티를 갖는다. Error 생성자 함수를 제공한다.
47.4 throw 문
Error 생성자 함수로 에러 객체를 생성한다고 에러가
발생하는것은 아니다. 생성과 발생은 의미가 다름.
에러를 발생 시키기 위해서 사용하는 방식이 throw
47.5 에러의 전파
45 장 프로미스 45.1.2 에러 처리 한계에서 살펴본 바와 같이 에러는 호출자
방향으로 전파 된다.
이를 보면 결국 스택의 구조를 따라가는것을 확인 할 수 있다.
이처럼 throw된 에러를 catch하지 않는다면 프로그램은 강제종료 되고
이를 적절하게 캐치 함으로 종료시키지 않고 처리 할 수 있게 되는것이다.
비동기 함수인 setTimeout과 같은 경우에서 에러가 발생하면, 이때는 호출자가 존재하지 않기 때문에
어떻게 될지 궁금하였고 이를 시도해 보았다.
try {
const response = await fetch('test.url');
const data = await response.json();
} catch (error) {
console.error('error fetching', error);
}
이런api 호출과 같은 비동기 처리를 할때 fetch와 같은 방식을 이용하는데
이때 에러의 경우 catch를 통해서 에러 핸들링이 가능하다.
따라서 위에서 setTimeout과 같은 방식을 이용하기 위해서는
function test() {
console.log("this func called");
}
setTimeout(() => {
try {
throw Error("error!");
} catch (e) {
console.log(e);
}
}, 0);
와 같은 방식으로 동작 시킬 수 있다.