본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 23] 예외 (feat. 예외의 기초)

I take exception to that(나는 그에 대해 반대한다)의 exception인 예외 상황

 

 

예외 발생은 코드가 실행되면서 문제가 발생할 경우 현재 함수나 현재 영역의 진행을 막게 되는데,

우리는 이에 대한 처리와 조치를 취할 수 있어야 한다.

오늘은 이러한 처리와 조치를 알기 전 예외란 무엇인지 알아보고자 한다.

 

 


 

 

[ 예외 상황 ]

 

Exception

: 예외가 던져지면(throw 예외명(예외 처리)) 실행 경로가 중단되고, 예외 객체는 현재 문맥을 벗어남

: 프로그래머스가 실수한 코드를 수정해야 한다는 예외에 대한 정보를 표시

: 예외를 잡아내지 않을 경우, 프로그램이 중단되며 스택 트레이스가 출력

: 문제를 처리하기에 충분한 정보가 맥락에 존재하는 일반적인 문제와 구분해야 함

 

* 스택 트레이스 : 예외가 발생한 파일과 위치 등과 같은 상세 정보

 


 

[ 예외 예시 ]

1) 예외 발생 현황 파악

import atomictest.* // 이전 블로그'테스트' 참고

fun averageIncome(income:Int, months:Int) = income/months

fun main(){
    averageIncome(3300, 3) eq 1100
    capture{
        averageIncome(5500, 0) // 예외 발생
    } eq "ArithmeticException: / by zero"
}

 

- 나눗셈에서 분모인 months가 0이면 나눗셈이 ArithmeticException을 던지지만, 해당 코드에서는 정보를 출력해주지 않음

- months가 0이면 결과로 일반적인 정수값을 반환할 수 없는 것을 위해 null을 출력하도록 코드를 수정할 필요가 있음

 

 

2) 예외 시 null을 반환하도록 수정

import atomictest.*

fun averageIncome(income:Int, months:Int) = {
	if(months == 0) null
    else income/months
}

fun main(){
	averageIncome(3300, 3) eq 1100
    averageIncome(5500, 0) eq null
}

 

- months가 0일 경우 null을 반환하도록 수정하여, 함수가 null을 반환할 수 있는 경우, 코틀린은 함수의 결과값을 사용하기 전 null 여부를 먼저 검사할 수 있음

 

 

3) 예외를 던저 함수를 종료 후 처리

import atomictest.*

fun averageIncome(income:Int, months:Int) = {
	if(months == 0) throw IllegalArgumentException("Months can't be zero") // 예외 던짐
    else income/months
}

fun main(){
	averageIncome(3300, 3) eq 1100
    capture{
    	averageIncome(5500, 0)
    } eq "IllegalArhumentException: " + "Months can't be zero"
}

 

- 'throw 예외 이름(예외 처리)' 를 통해 예외를 던짐

 


 

[ 오늘의 학습 소감 ]

 

오늘은 예외에 대한 기초적인 내용들만 다루는 아톰이었기에 어려운 내용은 아니었다. 하지만 예외는 언제 어디서든 발생할 수 있는 부분이기 때문에 개발자는 해당 부분을 잘 캐치하여 처리해 주어야 하기 때문에 아톰에서 설명한 것처럼 순서대로 차근차근 예외 발생 시점부터 해당 시점에 대한 예외를 던지는 것 까지 볼 수 있어서 좋았다. 오늘은 기초 부분만 했기 때문에 해당 예외를 던진 이후에 대한 처리 방법은 6부에서 진행하겠지만, 해당 아톰까지 갈 때 까지 예외에 대한 내용은 잊지 않기를...!