본문 바로가기

TIL

3. try ~catch문

try ~catch문

try ~catch문은 실행할 코드블럭을 표시하고 예외(exception)가 발생할 경우의 응답을 결정합니다.

아래의 예시를 보면

try {
normalFunction();
} catch (error) {
existentFunction(error);
}

정상적으로 동작했다면 normalFunction이 동작하고 try문을 진행하는 도중 error가 발생하면 existentFunction이 실행됩니다.

 

예를 들어

try {
console.log("코드 실행")
a;
console.log("코드 종료")
} catch(err) {
console.log("에러 발생")
}

위 코드를 보게 되면 try문이 진행되던 도중 정의되지 않은 변수 a에 의해 error가 발생하고 이로 인해 try 쪽을 건너 뛰고 에러 발생이라는 console.log()가 실행된다.

 

 

try ~catch문의 특징

1. try ~catch문은 오직 런타임 에러에만 동작한다. 문법적 오류로 인한 에러의 경우 try ~catch문은 정상적으로 동작하지 않는다.

 

2. try ~catch문은 동기적으로 동작합니다. 즉, setTimeout처럼 스케줄된 코드에서 발생한 예외는 try ~catch문으로 잡아낼 수 없다. 이것이 무슨 뜻이냐면 setTimeout으로 시간이 지나간 후에 실행되는 코드에서 발생하는 에러는 try ~catch문으로 잡을 수 없다는 것이다.

 

에러 객체

try ~catch문에서 에러가 발생하면 그 에러에 대한 상세한 내용이 담긴 객체(catch()의 괄호 안의 인수)를 생성합니다. 

이 에러 객체의 요소들은 대략적으로 아래와 같다.

 

1. name : 에러의 이름으로 예를 들어 정의되지 않은 변수에 의한 에러는 "ReferentceError"가 저장된다.

 

2. message : 에러의 상세 내용을 담고 있는 key

 

3. stack : 현재 호출 스택. 에러를 유발하는 중첩 호출들의 순서 정보를 가진 문자열로 디버깅에 사용됩니다.

 

throw 연산자

throw 연산자는 에러를 생성하는 연산자로 문법은

throw <errorObject>

위와 같다.

 

에러 객체를 생성해주는 방법은 아래와 같다.

let error = new SyntaxError("error message");

위코드가 실행되면 error 객체에는 name이 SyntaxError이고 massage가 "error message"라는 에러 객체가 저장된다. 

 

try ~catch ~finally

finally를 쓰게 되면 try ~catch문 실행 이후에 에러의 발생 유무와 관계없이 finally문 안의 코드는 실행됩니다.

 

문법은 아래와 같습니다.

try {
console.log("코드 실행");
a;
console.log("코드 종료");
} catch (err) {
console.log("에러 발생");
} finally {
console.log("finally 실행");
}

finally를 쓰는 경우 try ~catch문이 실행되어 그 코드를 빠져나가는 경우(ex. return으로 인한 종료)에도 동작하는 것이 특징입니다.