Go는 try .. catch .. finally 구문을 제공하지 않습니다. 그래서 아래와 같은 코드의 경우 프로그램은 패닉(Panic)에 빠지고 종료됩니다.
package main import ( "fmt" ) func main() { fmt.Println("result:", divide(1, 0)) fmt.Println("Today is good day.") } func divide(a, b int) int { return a / b }
try 구문이 있다면 divide 함수 내부쯤에서 try 구문을 통해 0으로 나뉨에 대한 예외를 처리하고 다시 정상적인 처리로 복구해 최종적으로 “Today is good day.”를 화면에서 볼 수 있습니다. 이에 대한 Go의 처리는 다음과 같습니다.
package main import ( "fmt" ) func main() { fmt.Println("result:", divide(1, 0)) fmt.Println("Today is good day.") } func divide(a, b int) int { defer func() { if err := recover(); err != nil { fmt.Println(err) } }() return a / b }
defer와 recover를 통한 것으로 defer의 인자로 지정된 함수는 마지막에 반드시 호출이 보장됩니다. 바로 이 defer에 지정된 함수 안에서 recover을 호출해 만약 현재 패닉상태라면 에러값을 얻고 정상 상태로 복구를 하게 됩니다. 이제 0으로 나뉘는 경우에도 에러의 내용고 함께 프로그램을 끝까지 정상적으로 실행하여 “Today is good day.”를 화면에 볼 수 있습니다. 아래처럼..
runtime error: integer divide by zero result: 0 Today is good day.