기본적으로 에러 처리를 구현하는 방법은 크게 두 가지가 있다.
if 문이나 단축 평가 또는 옵셔널 체이닝 연산자를 통해 확인하여 처리하는 방법과 에러 처리 코드를 미리 등록해 두고 에러가 발생하면 에러 처리 코드로 점프하도록 하는 방법이 있다.
try ~ catch ~ finally 문은 두 번째 방법이다. 일반적으로 이 방법을 error handling 이라고 한다.
try ~ catch ~ finally 문은 3개의 코드 블록으로 구성된다. finally문은 불필요하다고 생각하면 생략 가능하다.
try {
// 실행할 코드(에러가 발생할 가능성이 있는 코드)
foo();
} catch (err) {
// try 코드 블록에서 에러가 발생하면 이 코드 블록의 코드가 실행된다.
// err에는 try 코드 블록에서 발생한 Error 객체가 전달된다.
console.error(err); // ReferenceError: foo is not defined
} finally {
// 에러 발생과 상관없이 반드시 한 번 실행된다.
}
try ~ catch ~ finally 문을 실행하면 먼저 try 코드 블록이 실행된다.
try 코드 블록에 포함된 문 중에서 에러가 발생하면 발생한 에러는 catch문의 err변수에 전달되고 cath 코드 블록이 실행된다.
catch 문의 error 변수(아무 이름 사용 가능)는 try 코드 블록에 포함된 문 중에서 에러가 발생하면 생성되고 catch 코드 블록에서만 유효하다.
finally 코드 블록은 에러 발생과 상관없이 반드시 한 번 실행된다.
try ~ catch ~ finally 문으로 예외를 처리하면 프로그램이 강제 종료되지 않는다.
발생한 예외와 일치하는 catch 문이 있는 지 확인하고 일치하는 catch 문이 있다면 catch 블럭 내의 문장을 모두 실행하고 try catch 문을 빠져나가서 그 다음 준장을 수행한다.
일치하는 catch문이 없다면 예외는 처리안되고 에러가 발생한다.
참고
모던 자바스클비트 Deep Dive
https://ko.javascript.info/try-catch