LHJ

I'm a FE developer.

11.2 try/catch와 예외 처리

18 May 2020 » js_lj

11.2 try/catch와 예외 처리

예외 처리는 try … catch 문을 사용합니다.
뭔가를 시도(try)하고, 예외가 있으면 그것을 캐치(catch)한다는 뜻이 잘 드러납니다.

역주
catch를 ‘잡는다’라고 번역한 책이나 문서가 있지만, ‘에러를 잡는다’는 표현에는 에러를 해결한다는 뉘앙스가 있다고 생각해 캐치한다는 표현을 썼습니다. 곧 등장할 throw 역시 ‘던진다’라고 번역한 책이나 문서가 있지만, 에러가 ‘일어나게 했다’는 의미를 실려 일으킨다는 표현을 쓰겠습니다.

이전 예제의 validateEmail은 사용자가 이메일 주소에서 @을 빼먹은, 예상할 수 있는 에러는 처리할 수 있습니다.
하지만 예상치 못한 에러가 일어날 가능성은 여전한데, 예를 들어 부주의한 프로그래머가 email에 문자열이 아닌 어떤 것을 할당한다고 합시다.
지금대로라면, 이전 예제의 함수는 email에서 null, 숫자, 객체 등 문자열이 아닌 무언가가 들어온다면 에러를 일으킵니다.
프로그램은 앞뒤 설명 없이 멈춰버리겠죠.
이렇게 예상치 못한 에러에 대처하려면 try … catch 문을 사용해야 됩니다.

const email = null; // 이런...

try {
    const validatedEmail = validateEmail(email);
    if (validatedEmail instanceof Error) {
        console.error(`Error: ${validatedEmail.message}`);
    } else {
        console.log(`Valid email: ${validatedEmail}`);
    }
} catch (err) {
    console.error(`Error: ${err.message}`);
}

에러를 캐치했으므로 프로그램은 멈추지 않습니다.
에러를 기록하고 계속 진행할 수 있습니다.
물론 문제가 해결된 건 아닙니다.
유효한 이메일 주소가 필수라면 프로그램이 계속 진행할 수 없기는 마찬가지겠죠.
하지만, 최소한 앞뒤 사정도 모르고 그냥 멈추는 일은 막을 수 있습니다.

실행 흐름은 에러가 일어나는 즉시 catch 블록으로 이동합니다.
즉, validateEmail을 호출한 다음에 있는 if 문은 실행되지 않습니다.
try 블록 안에 쓸 수 있는 문의 숫자에 제한은 없습니다.
그중 에러가 일어나는 문에서 실행 흐름을 catch 블록으로 넘깁니다.
에러가 일어나지 않으면 catch 블록은 실행되지 않습니다.