- thorw new Error는 에러 객체 instance를 만들어서 사용하게 되어있다.
- thorw가 발생했는데 어디서도 받아주지 않으면 프로그램 종료된다.
- 그래서 thorw를 받는 try catch finally를 쓴다.
- try로 일단 함수를 시도해본다. 시도한 함수에서 예외가 있다면 catch 블록이 실행된다. (catch가 받는 인자에 throw가 던져준 값을 넣어준다고 생각하면된다. 보통 error의 e로 작성) 그리고 finally로 실행된다.
- 예외가 일어나지 않았을시에는 try하고 finally가 실행되고 바깥으로 빠져나간다.
- finally 구문은 예외가 나던 나지않던 실행된다고 보면된다.
- finally는 예외가 나더라도 반드시 실행되야 하는 코드가 있을 때 필요하다.
예를 들어 아래와 같이 쓴경우 doException을 실행하고 예외가 나지 않는다면 다음문장인consol.log('a')바로 실행되겠지만 예외 발생시 바로 catch로 가기 때문에 실행이 안되기때문이다.
function main() {
try {
doException('do');
consol.log('a') /// 예외가 날경우 실행 되지않음
} catch(e) {
console.log(e);
} finally {
consol.log('a') // 여기에 써줘야함
}
- noException()이라는 함수를 만들고 return true; 값으로 주고 실행한다면 catch 로 넘어가지 않고 바로 finally를 실행한다.
function main() {
try {
noExcepiton();
} catch(e) {
console.log(e);
} finally {
console.log('done');
}
}
- try catch의 특징은 예외가 함수 호출의 뎁스에 상관없이 바깥쪽으로 예외를 던지면 그 바깥쪽에 어떤 함수든 catch로 잡기만 하면된다. 즉 먼저 잡는 catch가 임자. catch로 잡고 다시 전파시키지 않는다.
function doException() {
throw new Error('와우! 오류야!');
}
function noExcepiton() {
return true;
}
function callException(type) {
if (type === 'do') {
doException();
} else {
noExcepiton();
}
}
function main() {
try {
callException('do'); // if문가서 doException(); 실행 후 에러 던져짐
} catch(e) {
console.log(e); // catch가 여기서 오류를 잡음
} finally {
console.log('done');
}
}