40. Error Control

자바스크립트의 에러 처리는 에러를 없애는 것이 아니라, try...catch, throw, 그리고 전파 규칙을 이해해 동기·비동기 상황에서도 프로그램의 실행 흐름을 통제하는 것


1. 에러 처리의 근본적 필요성

1.1 미처리 에러의 영향

에러가 발생하고 이를 처리하지 않으면, 해당 지점 이후의 코드는 실행되지 않는다. 이는 작은 실수 하나가 전체 프로그램을 중단시킬 수 있음을 의미한다.


1.2. try…catch를 통한 실행 흐름 유지

try...catch 문을 사용하면 에러가 발생하더라도 프로그램의 실행 흐름을 유지할 수 있다. 이는 에러를 제거하는 것이 아니라, 에러 상황에서도 정상적인 제어 흐름을 복구하는 방식이다.


1.3. 예외적 상황의 사전 관리

모든 문제 상황이 즉시 에러를 발생시키는 것은 아니다. 예를 들어 DOM API는 대상이 없을 경우 에러 대신 null을 반환하기도 한다. 이러한 값에 대한 후속 접근이 에러로 이어지므로, 사전에 조건 검사나 옵셔널 체이닝을 통해 예방하는 것이 중요하다.



2. 에러 처리 구문: try…catch…finally

2.1. try 블록의 역할

try 블록에는 에러 발생 가능성이 있는 코드를 작성한다. 에러가 발생하면 즉시 실행이 중단되고 제어권이 catch 블록으로 이동한다.


2.2. catch 블록의 역할

catch 블록은 try 블록에서 발생한 에러 객체를 전달받아 처리한다. 에러 발생 시에만 실행되며, 로깅, 사용자 알림, 대체 흐름 처리 등을 담당한다.


2.3. finally 블록의 역할

finally 블록은 에러 발생 여부와 무관하게 반드시 한 번 실행된다. 주로 자원 해제나 상태 정리와 같은 필수적인 후처리 로직에 사용되며, 필요하지 않다면 생략할 수 있다.



3. Error 객체와 내장 에러 유형

3.1. Error 객체의 구성

Error 객체는 에러에 대한 설명을 담은 message와 에러 발생 지점까지의 호출 경로를 나타내는 stack 프로퍼티를 포함한다. 특히 stack 정보는 디버깅 과정에서 중요한 단서를 제공한다.


3.2. 표준 내장 에러 유형

자바스크립트는 다음과 같은 표준 에러 생성자 함수를 제공한다.

  • SyntaxError
  • ReferenceError
  • TypeError
  • RangeError
  • URIError
  • EvalError

각 에러 타입은 오류의 성격을 명확히 드러내기 위한 목적을 가진다.



4. 에러의 발생과 전파

4.1. throw 문을 통한 에러 발생

에러 객체를 생성하는 것만으로는 에러가 발생하지 않는다. throw 문을 사용해야만 실행 흐름이 중단되고 에러로 인식된다.


4.2. 콜 스택을 통한 에러 전파

함수 내부에서 처리되지 않은 에러는 호출 스택을 따라 상위 함수로 전달된다. 이 과정에서 catch 블록을 만나면 처리되며, 끝까지 처리되지 않으면 전역에서 프로그램이 종료된다.


4.3. 비동기 처리에서의 에러 전파 한계

비동기 코드의 콜백 함수에서 발생한 에러는 호출자에게 전파되지 않는다. 이는 실행 컨텍스트가 분리되어 있기 때문이며, Promise의 .catchasync/awaittry...catch와 같은 비동기 전용 에러 처리 방식이 필요하다.



reference: 모던자바스크립트 Deep Dive 47장. 에러처리