November 8, 2021
아무리 프로그래밍에 능한 사람이더라도 에러가 있는 스크립트를 작성할 수 있습니다. 원인은 아마도 실수, 예상치 못한 사용자 입력, 잘못된 서버 응답 등의 수천만 가지 이유 때문일 겁니다.
에러가 발생하면 스크립트는 ‘죽고’(즉시 중단되고), 콘솔에 에러가 출력됩니다.
그러나 try..catch
문법을 사용하면 스크립트가 죽는 걸 방지하고, 에러를 ‘잡아서(catch)’ 더 합당한 무언가를 할 수 있게 됩니다.
try…catch 동작 알고리즘은 다음과 같습니다.
try {...}
안의 코드가 실행됩니다.try
안의 마지막 줄까지 실행되고, catch
블록은 건너뜁니다.try
안 코드의 실행이 중단되고, catch(err)
블록으로 제어 흐름이 넘어갑니다. 변수 err
(아무 이름이나 사용 가능)는 무슨 일이 일어났는지에 대한 설명이 담긴 에러 객체를 포함합니다.에러가 발생하면 자바스크립트는 에러 상세내용이 담긴 객체를 생성합니다. 그 후, catch
블록에 이 객체를 인수로 전달합니다.
try {
// ...
} catch(err) { // <-- '에러 객체', err 대신 다른 이름으로도 쓸 수 있음
// ...
}
내장 에러 전체와 에러 객체는 두 가지 주요 프로퍼티를 가집니다.
name
에러 이름. 정의되지 않은 변수 때문에 발생한 에러라면 "ReferenceError"
가 이름이 됩니다.
message
에러 상세 내용을 담고 있는 문자 메시지
표준은 아니지만, name
과 message
이외에 대부분의 호스트 환경에서 지원하는 프로퍼티도 있습니다. stack
은 가장 널리 사용되는 비표준 프로퍼티 중 하나입니다.
stack
현재 호출 스택. 에러를 유발한 중첩 호출들의 순서 정보를 가진 문자열로 디버깅 목적으로 사용됩니다.
catch
블록 안의 (*)
로 표시한 줄에서 다시 던져진(rethrow) 에러는 try..catch
‘밖으로 던져집니다’. 이때 바깥에 try..catch
가 있다면 여기서 에러를 잡습니다. 아니라면 스크립트는 죽을 겁니다.