쌓고 쌓다

[JavaScript] 예외 처리, 예외 객체, 예외 강제 발생 본문

프로그래밍/JavaScript

[JavaScript] 예외 처리, 예외 객체, 예외 강제 발생

승민아 2023. 1. 7. 17:15

기본 예외 처리

조건문을 사용하여 예외 처리하는 것을 기본 예외 처리라고 한다.

 

body 태그 내부에 h1 태그가 없을 수도 있기에 조건문으로 아래처럼 기본 예외 처리 가능하다.

document.addEventListener('DOMContentLoaded', () => {
    const h1 = document.querySelector('h1')
    if(h1) {
        h1.textContent = 'h1 태그'
    } else {
        console.log('h1 태그가 존재하지 않습니다.')
    }
})

 

고급 예외 처리

try catch finally 구문을 사용해서 예외를 처리하는 것을 고급 예외 처리라고 한다.

 

형태

try {
    // 예외가 발생할만한 코드
} catch (exception) {
   // 예외가 발생했을때 실행할 코드
} finally {
   // 무조건 실행될 코드
}

식별자 exception을 예외 객체라고 부르는데 아무 식별자를 입력해도 된다. 보통 e나 exception을 쓴다.

finally 구문은 필수가 아니며 생략이 가능하고, 예외가 발생하든 말든 무조건 실행되는 코드를 작성할 수 있다.

 

try catch 실행 순서

존재하지 않는 객체 willExcept에 존재하지 않는 메소드 bye() 메소드를 실행해 보자.

document.addEventListener('DOMContentLoaded', () => {
    try {
        willExcept.bye()
        console.log('try 구문 마지막 코드')
    } catch (exception) {
        console.log('catch 구문 마지막 코드')
    }
})

실행 결과

 

willExcept.bye() 메소드를 실행하자 예외가 발생하여 바로 catch 구문으로 이동하기에

console.log('try 구문 마지막 코드')는 실행되지 않았다.

 

finally 구문을 사용하는 차이

throw로 강제 예외를 발생시켜 finally의 필요성을 보이는 코드를 이해해 보자.

 

function test() {
    try {
        console.log('A 위치')
        throw "에외 강제 발생"
    } catch (exception) {
        console.log('B 위치')
        return
    }
    console.log('C 위치')
}

test()

catch 구문에서 return을 하면 try catch 구문 밖에 있는 'C 위치'는 출력을 하지 못한다.

 

 

만약 아래처럼 finally 구문에 'C 위치' 출력이 있다면 실행이 될 것 같은가?

function test() {
    try {
        console.log('A 위치')
        throw "에외 강제 발생"
    } catch (exception) {
        console.log('B 위치')
        return
    } finally {
        console.log('C 위치')
    }
}

test()

놀랍게도 출력이 된다...

 

finally 구문은 반드시 실행해야 된다는 특성이 있기에 위의 예처럼

아래의 경우에 결과가 달라진다.

  1. try catch 구문 내 return 키워드를 만났을 때
  2. try catch 구문 내 break 또는 continue 키워드를 만났을 때

 

예외 객체

예외가 발생하면 관련된 정보를 담은 객체가 있다. 그것이 예외 객체이다.

 

try {
 ...
} catch (exception) {
 ...
}

catch 괄호 안에 노란색으로 표시한 exception이 예외 객체이다.

 

이 객체는 아래의 속성을 갖는다.

속성 이름 설명
name 예외 이름
message 예외 메세지

 

존재하지 않는 객체 willExcept의 bye 메소드를 실행해 보자.

function test() {
    try {
        willExcept.bye()
    } catch (exception) {
        console.log(`exception.name: ${exception.name}`)
        console.log(`exception message: ${exception.message}`)
    }
}

test()

 

예외 강제 발생

throw 키워드로 예외를 강제로 발생시킨다.

두 가지 형태가 있다.

throw 문자열

throw new Error(문자열)

 

두가지 형태의 예외 발생을 출력해보면 차이가 있다.

 

1. throw 문자열

2. throw new Error(문자열)

 

예외 강제 발생의 필요성

 

아래의 코드를 보자

function test(object) {
    console.log(object.a + object.b)
}

test({})

 

object 객체에는 속성 a, b가 없음에도 자바스크립트에서는

object.a, object.b가 undefined로 나온다.

그래서 undefined + undefined를 하여 NaN이 나온다.

이것을 오류가 없이 정상 작동이 된다...

 

그래서 사용자가 함수를 정상적인 방법으로 사용하지 못하게 막는 방법으로 예외를 발생시킬 필요가 있다.

function test(object) {
    if(object.a !== undefined && object.b !== undefined) {
        console.log(object.a + object.b)
    } else {
        throw new Error('a 속성과 b 속성이 존재하지 않음.')
    }
}

test({})

 

Comments