고급 예외 처리에는 try catch finally 구문이 있다. 기본적인 구조는 아래와 같다.
try {
// 예외가 발생할 가능성이 있는 코드
} catch(exception) {
// 예외가 발생할 경우 실행되는 코드
} finally {
// 예외와 상관없이 무조건 실행할 코드. 필요한 경우에만 사용
}
예시로 살펴보자
try {
// console.log("Hi")
errorStart.asdf();
} catch(exception) {
alert("에러발생")
}
// finally {
// console.log("무조건 무조건이야~")
// }
위의 js코드에서 try문에서 errorStart.asdf()를 실행시킬경우 그런 것은 존재하지않기에 catch문의 코드가 실행된다. 반대로 errorStart~를 주석처리하고 console.log("Hi")를 실행시키면 catch문이 실행되지않는것을 볼 수 있다. catch문은 에러가 발생할때만 실행되기 대문에 에러가 발생하지않으면 실행되지않는다. 이후 finally문을 실행시키면 console.log를 실행시키든 errorStart를 실행시키든 무조건 콘솔창에 해당 문구가 적히는 모습을 볼 수 있다.
errorStart 밑에 console.log 를 찍게되면 errorStart에서 이미 에러가 발생하였기에 더이상 try문을 진행하지않고 바로 catch문으로 빠져나가는 모습을 볼 수 있다.
try {
errorStart.asdf();
console.log("야 찍혔냐?");
} catch(exception) {
alert("에러발생");
}
그러면 여기서 한가지 의문이 생길 수 있다. catch문을 놔두고 왜 finally를 써야할까??
이는 return 키워드를 통해 예시로써 알아 볼 수 있다.
function test () {
try {
console.log("try 시작");
throw "예외 발생"
} catch(exception) {
console.log("catch 시작");
return
}
console.log("try catch 끝");
}
test();
function test2 () {
try {
console.log("try 시작");
throw "예외 발생"
} catch(exception) {
console.log("catch 시작");
return
}
finally {
console.log("try catch 끝");
}
}
test2();
위의 코드를 실행시켜보면 test의 경우 catch에서 return 값을 주었기때문에 그 이후 console.log가 실행되지않는 모습을 볼 수 있다.
그러나 finally문으로 감싸줄 경우 return 하였음에도 finally문의 강제성 덕분에 try catch 끝 이라는 콘솔이 찍히는 모습을 볼 수 있다.
프로그래밍을 하다보면 예외가 생길 수 있고 그러한 예외와 발생된 정보를 확인할 수 있는데, 이러한 정보를 확인하게 해주는것이 예외 객체이다.
위의 고급 예외 처리에서 catch문 안에 (exception)을 적은 모습을 볼수있는데 (exception)이 예외 객체이다.
function test3 () {
try {
throw " 강제 예외 발생 "
} catch (exception) {
console.log("예외 발생");
console.log(exception);
}
}
test3();
throw문법을 이용해 강제로 예외를 발생시기고 catch문에서 console.log로 exception을 출력시키면 throw의 내용이 출력된다.
function test4 () {
try {
const a = new Array(9999999999999999999999999999999999);
} catch (exception) {
console.log(exception);
}
}
test4();
위와 같이 자바스크립트가 처리할수있는 배열의 크기를 넘게 입력하여 강제로 오류를 발생시키고 console.log로 예외객체를 출력시키면 RangeError가 출력되고 어디에서 에러가 떳는지 파일이름과 에러가 발생한 라인을 보여주는 모습을 볼 수 있다.