프로그래밍 언어의 오류(error)에는 크게 2가지 종류가 있다.
코드에 잘못된 철자가 있다면 발생하는 오류이다.
프로그램이 아예 구동하지 못하거나 중간에 멈추는 현상을 야기한다.
console.log("Hello")
console.log("안녕하세요"
예시로 함수 뒤에 괄호를 닫지 않고 실행했을 시 구문오류가 발생한다.
caught SyntaxError: missing ) after argument list
console.log("Hello")
console.rog("안녕하세요")
이번에는 오탈자를 입력했을 시 예시이다.
이번에도 마찬가지로 오류를 출력하나, 코드는 실행이 된 직후 오류를 발생시킨다.
Hello
Uncaught TypeError: console.rog is not a function
이처럼 실행중에 예기치 못한 상황이 발생하여 진행할 수 없는 상황이 되었을 때 발생하는 오류가 예외이다.
자바스크립트에서는 SyntaxError라고 출력되는 오류 외 모든 오류(TypeError, ReferenceError, RangeError)가 예외로 분류된다.
코드 실행 중 예기치 못한 에러가 발생했을 때, 코드의 실행 흐름을 복구할 수 있는 기능이 내장되어 있는데, 이 기능을 아울러 예외 처리라고 부른다.
예외를 처리하기 위해 자바스크립트를 포함한 대부분의 프로그래밍 언어는 try-catch 구문을 제공해 예외를 처리할 수 있도록 해준다.
아래는 try-catch 구문의 기본 문법
try{
// 1) 이 코드에서 오류가 발생하면
// 2) 발생하지 않는다면
} catch (e) {
// 1) 여기 있는 코드를 실행하고
// 2) 여기 있는 코드를 실행 하지 말아주세요
} finally {
// 3) 여기 있는 코드는 무조건 실행해주세요
}
아래 예제는 선언되어 있지 않은 변수의 메서드를 호출해 오류를 발생한다.
try {
arr.method()
} catch (e) {
console.log(e)
} finally {
console.log("무조건 실행되는 코드")
}
try
구문에서 선언되어 있지 않은 변수의 메서드를 호출했으니 catch
구문에서는 이 오류를 잡아(catch) catch
구문의 코드를 실행시키게 된다.
finally
구문은 무조건 실행되는 블록이기 때문에 finally 구문의 코드를 실행하게 되는 것이다.
실행결과
ReferenceError: arr is not defined at <anonymous>:2:5
무조건 실행되는 코드
여기서 의문이 하나 생기게 된다.
"
finally
구문은 왜 쓰는거지?"
catch
구문에 finally
구문의 코드를 넣어도 결과가 비슷하게 나올 수 있지 않을까라는 생각을 하게 되는데, catch
구문 내부에서 return
키워드나 break
, continue
키워드를 만났을 때에는 결과가 달라지게 된다.
아래 예제를 예시로 들면
(function test() {
try {
console.log("첫번째 실행")
throw new Error("에러 발생") // throw 키워드로 에외를 강제로 발생시킴
} catch (e) {
console.log("두번째 실행")
return
}
console.log("마지막 실행")
})()
finally
구문을 사용하지 않았을 때에는 return
키워드를 만나 함수 내부에서 빠져나오게 되어 "마지막 실행" 이라는 콘솔 로그 함수가 실행되지 않는것을 확인할 수 있다.
아래 예제에서 finally
구문을 사용했을 때 return
키워드를 만나면 어떻게 동작하는지 알아보도록 하자
(function test() {
try {
console.log("첫번째 실행")
throw new Error("에러 발생") // throw 키워드로 에외를 강제로 발생시킴
} catch (e) {
console.log("두번째 실행")
return
} finally {
console.log("마지막 실행")
}
})()
finally
구문을 사용했을때는 우리가 의도했던대로 "마지막 실행"이 콘솔창에 출력되는 것을 확인할 수 있다.
브라우저에서 사용하는 자바스크립트에서는 쓸모가 없지만, Node.js와 같이 서버로 사용하는 자바스크립트에서는 이러한 내용을 기억해야 견고한 코딩을 할 수 있다.
코드 실행중에 예기치 못한 상황이 발생하여 진행할 수 없는 상황이 되었을 때 발생하는 오류가 예외이다.
이러한 예외가 발생했을 때 정보를 확인할 수 있게 해주는 것이 예외 객체이다.
또, try-catch
구문에서 catch
의 매개변수의 인자로 전달되는 값이 예외 객체이다.
예외 객체가 가지고 있는 속성은 브라우저에 따라서 조금씩 다르나, 모든 웹 브라우저가 공통적으로 가지고 있는 속성은 name
과 message
가 있다.
try{
console.rog("hello")
} catch (e) {
console.log(e.name)
console.log(e.message)
}
name
은 예외의 이름, message
는 예외 메시지이다.
실행결과
TypeError
console.rog is not a function
상황에 따라 예외를 강제로 사용자가 발생시켜야 하는 경우도 있다.
그럴 때 throw
키워드가 사용된다.
// 단순 예외 발생
throw "문자열"
// ------------------------------------------------
// 더 자세한 예외 발생
throw new Error("문자열")
실행결과
Uncaught 문자열
Uncaught Error: 문자열 at <anonymous>:1:7