munifico.github.io

munifico's anything page

Follow me on GitHub

try/catch와 예외 처리

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

function validateEmail(email) {
    return email.match(/@/) ? email : new Error(`Invalid email : ${email}`);
}

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

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

munifico’s 생각 : 예제가 좀 이상하다…?

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

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


이전 : Error 객체
다음 : 에러 일으키기
목차