본문 바로가기

Coding/go

[golang] defer 무한루프

defer 무한루프

defer에 대해 배웠는데, 예외처리 하는 곳에서 자꾸 무한루프가 발생했습니다.

결론부터 말하자면, 원인은 nil 처리를 안해서 그랬습니다.

 

package main

import "fmt"

func test() {
	var num int
	fmt.Scanln(&num)

	defer func() {
		if r := recover(); r != nil {
			fmt.Println(r) //에러 메시지 출력
			test()
		}
	}()

	if num <= 0 {
		panic("잘못된 입력 입니다.")
	}

}

func main() {
	test()
}

 

panic이 발생할때 뿐만 아니라, test() 함수가 끝날때도 defer 함수로 오기 때문입니다. nil 처리를 안하면 무한루프를 타게됩니다.

 

panic & recover

패닉; 종료되기 이전에 "걸어두는 느낌"

리커버: nil 과 사용

하면서 느낀게 중요한것은 함수를 다른곳에서 호출하게 만들면 코드의 응집도(Cohesion) 이 깨져. 각 호출됨에 따른 리턴을 처리해줘서 별로 안좋은걸 느꼈습니다. (link)