Search

[Go 기초] [#13] 에러 처리와 패닉

작성일시
2025/05/26 14:31
수정일시
2025/05/26 15:07
스택
Go
카테고리
Tutorial
태그
예외처리
에러
error
panic
1 more property

Go의 에러 처리 철학

Go 언어는 명시적인 에러 처리를 선호합니다. 다른 언어들처럼 예외(Exception)를 사용하지 않고, 에러를 값으로 처리하는 방식을 채택했습니다.

에러는 왜 값으로 처리할까?

에러 처리를 강제할 수 있습니다.
코드의 흐름을 명확하게 파악할 수 있습니다.
에러 상황에 대한 처리를 개발자가 명시적으로 결정할 수 있습니다.

error 인터페이스

Go 언어에서는 에러를 처리하기 위한 특별한 방법을 제공합니다. 바로 error 인터페이스입니다.
type error interface { Error() string }
Go
복사
위 코드에서 보시는 것처럼, error 인터페이스는 단 하나의 메서드만을 가지고 있습니다.
Error() 메서드는 에러에 대한 설명을 문자열로 반환합니다.

기본적인 에러 처리

실제로 에러를 어떻게 처리하는지 간단한 예제를 통해 알아보겠습니다.
아래는 두 숫자를 나누는 함수입니다.
package main import ( "errors" "fmt" ) func divide(a, b float64) (float64, error) { if b == 0 { // errors 패키지의 New 함수를 이용하면, // Error() 메서드를 가지는 구조체를 선언하지 않더라도 // 나만의 에러를 만들 수 있습니다. return 0, errors.New("division by zero") } // 에러가 아닐 경우엔 이렇게 nil 을 반환해야 합니다. return a / b, nil } func main() { result, err := divide(10, 2) // Go 에서는 이렇게 반환값을 받자마자 에러를 예외 처리합니다. if err != nil { fmt.Println("Error :", err) return } fmt.Printf("Result : %.2f\n", result) }
Go
복사
divide 함수는 두 가지 값을 반환합니다.
첫 번째는 계산 결과이고, 두 번째는 에러입니다. 만약 에러가 없다면 nil을 반환합니다.
이렇게 첫번째 반환 값은 함수의 결과, 두번째 반환 값은 에러를 반환하는 패턴은 Go에서 매우 자주 보이는 패턴입니다.

패닉(Panic)

에러와는 다르게, 패닉은 정말 심각한 문제가 발생했을 때 사용됩니다. 프로그램이 더 이상 실행될 수 없는 상황에서 발생하는 것이죠. 패닉이 발생하면 프로그램은 즉시 현재 함수의 실행을 중단하고, 모든 지연된(deferred) 함수들을 실행한 후 종료됩니다.

패닉이 발생하는 경우

패닉은 주로 다음과 같은 상황에서 발생합니다:
배열의 범위를 벗어난 접근 (예: 길이가 5인 배열의 6번째 요소에 접근하려고 할 때)
nil 포인터 역참조 (예: nil인 객체의 메서드를 호출하려고 할 때)
고루틴 스택 오버플로우 (재귀 함수가 너무 깊게 호출될 때)
개발자가 명시적으로 panic() 함수를 호출했을 때

패닉 복구하기 (defer와 recover)

다행히도 Go는 패닉이 발생해도 프로그램을 복구할 수 있는 방법을 제공합니다. defer와 recover를 사용하면 됩니다.
package main import "fmt" func example() { // defer로 패닉을 복구하는 함수를 등록 defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }() // 패닉 발생 panic("something went wrong") } func main() { fmt.Println("프로그램 시작") example() fmt.Println("프로그램 계속 실행") // 패닉이 복구되어 이 줄이 실행됨 }
Go
복사
위 예제에서는 defer를 사용해 함수가 종료되기 전에 반드시 실행될 코드를 지정했습니다. 이 코드는 recover()를 호출하여 패닉이 발생했는지 확인하고, 발생했다면 프로그램을 정상적인 상태로 되돌립니다.

Don't Panic

Go 커뮤니티에서는 Don't Panic 이라는 원칙을 강조합니다.
이는 패닉 사용을 최소화해야 한다는 의미입니다.

패닉을 피해야 하는 이유

프로그램의 안정성 : 패닉은 프로그램을 예기치 않게 종료시켜 안정성을 저해할 수 있습니다.
예측 가능성 : 일반적인 에러 처리는 예측과 관리가 용이하지만, 패닉은 그렇지 않습니다.
유지보수 : 패닉 사용은 코드의 유지보수를 어렵게 만듭니다.

대신 사용할 수 있는 방법

패닉 대신 다음과 같은 방법을 권장합니다.
error 타입 반환 : 함수의 실패 가능성을 고려해 error를 반환하도록 설계하기
다중 반환값 : 필요한 경우 여러 반환값으로 상태 전달하기
명시적인 에러 처리 : if err != nil 패턴으로 체계적으로 에러 처리하기
명심하세요. 패닉은 오직 복구가 불가능한 상황에서만 사용해야 합니다. 일반적인 오류에 대한 예외 처리가 필요한 상태라면 error 인터페이스를 사용하세요.
강의 목록

참조