앞서 프로그래밍 언어 오류에 해당하는 구문 오류와 예외에 대해 알아보았다.
이번 글에서는 특히 예외를 처리하는 상황에서 사용할 수 있는 고급 기능을 살펴보고자 한다.
프로그래밍 언어에서 예외가 발생하면 예외 객체를 통해 발생한 예외와 관련된 정보를 확인할 수 있다.
그런데 JavaScript는 다른 프로그래밍 언어에 비해 예외가 거의 발생하지 않는 프로그래밍 언어이고
이는 프로그램에 수많은 버그를 일으킬 수 있는 요소가 되기도 한다.
때문에 개발자가 예외를 강제로 발생시켜야 하는 경우도 빈번하게 존재하는데,
이때 throw 키워드를 사용할 수 있다.
예외 객체
앞서 try catch finally 구문에서 catch의 괄호 안에 exception을 입력하였다.
이때 exception이 바로 예외 객체로, 아무 식별자나 입력해도 상관 없지만 일반적으로 e, exception을 사용한다.
예외 객체가 가지고 있는 속성은 브라우저에 따라 상이하나, 공통적으로 다음의 속성은 가진다.
- name: 예외 이름
- message: 예외 메시지
<script>
try {
const array = new Array(99999999999999999)
} catch (exception) {
console.log(exception)
console.log(`예외 이름: ${exception.name}`)
console.log(`예외 메시지: ${exception.message}`)
}
</script>
RangeError: Invalid array length
at file:///C:/Users/minha/Desktop/test.html:12:19 {stack: 'RangeError: Invalid array length
at file:///C:/Users/minha/Desktop/test.html:12:19', message: 'Invalid array length'}
예외 이름: RangeError
예외 메시지: Invalid array length
예외 강제 발생
앞서 JavaScript는 다른 프로그래밍 언어에 비해 예외가 거의 발생하는 않는 프로그래밍 언어로, 수많은 버그를 일으키기도 한다고 하였다.
예를 들어 아래의 코드를 살펴보자.
<script>
function test(object) {
console.log(object.a + object.b)
}
test({})
</script>
일반적인 프로그래밍 언어라면 {}에 a 속성과 b 속성이 존재하지 않고, 존재하지 않는 것을 더하므로 예외를 발생시킬 것이다.
하지만 JavaScript에서는 {}.a와 {}.b가 undefined를 가지고 undefined를 더하므로 NaN을 출력하여 예외가 발생하지 않는다.
즉, 실제로는 정상적으로 작동하지 못 했음에도 외부적으로는 예외가 발생하지 않기에 사용자에게 혼란을 줄 수 있는 것이다.
이와 같이 코드가 의도한 바와 다르게 사용되는 경우를 방지하기 위해 강제로 예외를 발생시킬 수 있다.
예외를 강제로 발생시켜야 하는 경우 throw 키워드를 사용한다.
throw 문자열
이때 문자열에는 예외 내용을 입력하면 된다.
아래와 같이 사용할 경우 예외가 발생한 위치까지 나타낼 수 있다.
throw new Error(문자열)
예를 들어 위의 예시는 다음과 같이 해결할 수 있다.
<script>
function test(object) {
if (object.a !== undefined && object.b !== undefined) {
console.log(object.a + object.b)
} else {
throw new Error('a 속성과 b 속성을 지정하지 않았습니다.')
}
}
test({})
</script>
Uncaught Error Error: a 속성과 b 속성을 지정하지 않았습니다.
at test (c:\Users\minha\Desktop\test.html:15:13)
at <anonymous> (c:\Users\minha\Desktop\test.html:19:3)
이 글은 혼자 공부하는 자바스크립트 (윤인성 저)를 바탕으로 공부한 내용을 작성한 글입니다.
'Frontend > JavaScript' 카테고리의 다른 글
클래스 ② 클래스 고급 (0) | 2024.10.28 |
---|---|
클래스 ① 클래스 기본 (4) | 2024.10.28 |
예외 처리 ① 구문 오류와 예외 (0) | 2024.10.27 |
문서 객체 모델 ② 이벤트 활용 (8) | 2024.10.26 |
문서 객체 모델 ① 문서 객체 조작 (0) | 2024.10.02 |