study: Javascript | 숨참고 deep dive (47) 에러 처리

Lumpen·2023년 4월 12일
0

Study

목록 보기
46/92

에러 처리의 필요성

에러가 발생하지 않는 코드를 작성하는 것은 불가능하다
에러에 대처하지 않고 방치하면 프로그램은 강제 종료된다
try...catch 문을 사용하여 발생한 에러에 적절히 대응하면
계속해서 코드를 실행시킬 수 있다

try...catch...finally 문

기본적으로 에러 처리를 구현하는 방법은 크게 두 가지가 있다
예측할 수 있는 예외에 대해서는 if 문이나 단축 평가 또는 옵셔널 체이닝 등으로
원치 않는 값이 나왔을 경우 발생할 코드를 작성하는 방법과
에러 처리 코드를 미리 등록해두고 에러가 발생하면 에러 처리 코드가 실행되도록 하는 방법

try...catch...finally 문은 두 번째
finally 만 옵션 으로 작성한다

Error 객체

Error 생성자 함수는 에러 객체를 생성한다
에러를 설명하는 인수를 전달할 수 있다

const error = new Error('error')

Error 객체는 message 프로퍼티와 stack 프로퍼티를 갖는다
message 프로퍼티의 값은 Error 생성자 함수에 인수로 전달할 메시지이고
stack 프로퍼티의 값은 에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열이며
디버깅 목적으로 사용한다

자바스크립트에서는 다음과 가팅 7가지의 Error 생성자 함수를 제공한다

생성자 함수인스턴스
Error일반적인 에러 객체
SyntaxEror문법에 맞지 않는 문을 해석할 때 발생하는 에러 객체
ReferenceError참조 에러 객체
TypeError피연산자 또는 인수의 데이터 타입이 유효하지 않을 때 발생하는 에러 객체
RangeError숫자 값의 허용 범위를 벗어났을 때 발생하는 에러 객체
URIErrorencodeURI 또는 decodeURI 함수에 부적절한 인수를 전달했을 때 발생하는 에러 객체
EvalErroreval 함수에서 발생하는 에러 객체

throw 문

Error 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것은 아니다

에러를 직접 발생시키기 위해서는 throw 문으로 에러 객체를 던진다
throw new Error('error')

에러 전파

에러는 호출자 방향으로 전파된다
콜 스택의 아래 방향으로 전파된다

const foo = () => {
	throw Error('foo error')
}

const bar = () => {
	foo()
}

const baz = () => {
	bar()
}

try {
	baz()
} catch (err) {
	console.log(err)
}

foo 에서 throw 한 에러는 호출자에게 전파되어
전역에서 캐치된다

위 코드는 전역에서 catch 문을 사용하였기 때문에
전역 까지 에러가 전파되지만
중간에 catch 를 하여 적절히 대응하면
프로그램이 종료되지 않고 코드 실행 흐름을 가져갈 수 있다
throw 한 에러를 어디에서도 catch 하지 않는다면
프로그램은 종료된다

가능한 좁은 범위에서 catch 를 할 수 있으면 좋을듯

주의할 점은 비동기 함수인 setTimeout 이나
프로미스 후속 처리 메서드의 콜백 함수는 호출자가 없다는 것이다
따라서 에러를 전파할 호출자가 존재하지 않으므로
에러 발생 시 프로그램이 종료된다

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글