1. 예외란?
초간단하게 그냥 에러다.
그렇다면 예외처리란?
말그대로 에러가 발생했을때 어떻게 할 것인가를 나타낸다.
프로그래밍이란 에러와의 싸움이다.
오죽하면 프로그래머의 실력은 경험한 에러의 양과 비례한다고 하겠는가
나도 지금까지 수 많은 에러를 경험했다.
그러니, 이번에 분명히 짚고 넘어가자
예외처리란 전쟁무기와도 비슷한것 같다.
그 누구도 쓸일이 없기를 바라며 실제로 쓸일이 없었다 한들 방심하고 방치해선 안 되는 점에서 말이다.
1-1 구문오류
쉽게말해 나같은 실력이 부족한 병아리 개발자가 오타를 섰거나 괄호 갯수를 잘 못 입력해서 아예 실행조차 안 되는 경우를 말한다.
사소한 오타 하나 때문에 웹 브라우저가 코드를 읽지 못하는 경우는 아주 흔하다.
이런 경우 다음과 같은 에러가 발생한다.
예를 들어, console.log()의 괄호를 닫지 않으면 다음과 같이 발생한다.
D:\VSCode-prac\연습용\app.js:1
console.log(
SyntaxError: Unexpected end of input
이러한 류의 오류는 보통 어디서 못 읽었는지를 알려주기 때문에 해결하기 쉬운 편이다.
당장 위 코드만해도 D 드라이브의 VSCode-prac 폴더의 연습용 폴더의 app.js 파일의 1번째 줄에서 에러가 났으며
그 에러가 난 코드를 정확하게 보여주고 있다.
1-2 예외
실행중 발생하는 에러로 런타임 오류라고 한다.
이번엔 console.log()를 console.rog()로 잘 못 입력해 보겠다.
PS D:\VSCode-prac\연습용> node app
D:\VSCode-prac\연습용\app.js:1
console.rog()
^
TypeError: console.rog is not a function
이번에도 에러가 난 부분을 정확하게 짚어주고 있다.
console에는 rog라는 메소드가 없다.
때문에 에러가 발생한다.
다만 아까와는 다른 큰 차이점이 있다.
그 차이점을 알아보기 위해 다음을 각각출력해 보겠다
console.log("aaaa")
console.rog()
console.log("aaaa")
console.log(
이결 출력한 결과는 다음과 같다.
PS D:\VSCode-prac\연습용> node app
aaaa
D:\VSCode-prac\연습용\app.js:2
console.rog()
^
TypeError: console.rog is not a function
D:\VSCode-prac\연습용\app.js:2
console.log(
SyntaxError: Unexpected end of input
차이점을 찾았는가?
메소드를 잘 못 입력한 경우에는 aaaa가 출력되는 것을 알 수 있다.
반면 괄호를 입력하지 않은 경우에는 어떤것도 출력되지 않는다.
즉 구문오류와는 달리 예외란 문제가 발생한 부분 전까지는 전부 실행된다는 차이점이 있다.
2. 기본 예외 처리
조건문을 사용해서 예외를 발생하지 않게 하는 것을 기본 예외처리라고 한다.
예를들어, 특정 값을 추출했는데 if문을 사용해 이 값이 존재하는 값인지 아닌지를 분별해낼 수 있다.
물론 if 문을 쓰지 않고 없는 값을 출력했다고 해서 코드가 멈춰버릴만큼 자바스크립트가 융통성이 떨어지는 언어는 아니다.
다만 그렇다고 해서 예외처리를 해주지 않으면 이것이 나중에 문제를 일으킬 수 있으며
추후에 문제가 발생했을 때 문제를 파악하기 어려울 수도 있다.
때문에 문제가 예상되는 부분에는 조건문으로 예외처리를 해주는 것이 좋다.
3. 고급 예외 처리
try, catch, finally 문을 사용한 예외처리를 고급 예외처리라고 한다.
이것을 살펴보면 다음과 같다.
try{
//try 구역
} catch (exception){
//catch 구역
} finally {
//finally 구역
}
보시다시피 3개의 구역으로 나뉜다.
try: 에러가 발생할 수 있다고 여겨지는 코드들을 여기에 넣는다.
이곳에 들어간 코드는 위에서부터 순차적으로 실행된다.
catch: try구역을 실행하던 도중 에러가 발생할 경우, try를 멈춰버리고 이곳으로 넘어간다.
만약 에러가 발생하지 않는다면 이 구역은 실행되지 않는다.
finally: try 구역에서 에러가 발생했든 하지 않았든 최종적으로 실행되는 부분이다.
만약 try 구역에서 에러가 발생했다면 catch로 넘어와서 catch를 모두 실행한 다음 finally를 실행한다.
만약 try 구역에서 에러가 발생하지 않았다면 try 구문을 종료하고 바로 finally로 넘어온다.
단, finally는 필수 구역이 아니다. 없어도 상관없는 부분이다.
3-1. finally는 언제 쓰는가?
finally구문은 언제 써야하는가? 라고 생각할 수 있는데
주로 try구문 안에 return이나 continue, break와 같은 함수를 탈출하는 구문을 사용한다면 쓸 수 있다.
이러한 함수를 끝내는 명령어와 만나면 그걸 실행하기 직전에 finally를 실행한다.
try{
console.log("aaa")
return
console.log("bbb")
} catch (exception){
console.log("ccc")
} finally {
console.log("ddd")
}
예를 들어 위의 코드를 보자
aaa를 출력하고 return을 만난다.
그럼 진짜로 return을 하기 전에 finally를 먼저 실행한다.
그리고 진짜로 retrun을 한다.
즉 출력 결과는 아래와 같다.
aaa
ddd
4. 마지막
에러를 없앨 수는 없을까?
이쯤되면 나같은 병아리 개발자는 에러가 예상된다면 여러가지 시도를 통해 에러가 발생하지 않게 하면 되지 않느냐고 생각할 수 있다.
그러나 에러라는 것은 그렇게 단순한 것만 있는게 아니다.
예를 들면 로그인을 할 때 아이디나 비밀번호를 잘 못 입력한 것도 일종의 에러라고 할 수 있기 때문이다.
즉, 사용자가 로그인 할 때, 아이디나 비밀번호를 잘 못 입력하는 경우가 발생할 경우를 대비해 저런 구문을 사용하는 것이라고도 할 수 있다.
또한 예외처리는 이것만 있는게 아니다.
예외처리 고급에 관한 부분은 다음에 이 게시글의 내용을 추가하거나 아니면 새로운 게시글을 작성하도록 하겠다.
'Language > JavaScript' 카테고리의 다른 글
JavaScript 공부정리 - 클래스 (0) | 2022.10.19 |
---|---|
JavaScript 공부정리 - 프리티어 (0) | 2022.10.14 |
JavaScript 공부정리 - 호이스팅 (0) | 2022.10.07 |
JavaScript 공부정리 - 클래스 (0) | 2022.10.07 |
JavaScript 공부정리 - 객체 - 리터럴 (1) | 2022.10.07 |