Go용 금기 오류 처리기 만들기



오류 처리에 도움이 되도록 Golang용this module을 만들었습니다. 이 아이디어는 내 동료가 핸들러에서 서비스로, 저장소로 전달context하여 오류 로그를 더 자세히 추적하려고 할 때 나타났습니다. 나는 그것이 context의 목적이 아니라고 생각했기 때문에 그의 의견에 동의하지 않았습니다. 내가 틀렸거나 그가 틀렸거나 우리 둘 다 틀렸을 수도 있습니다. 이것이 프로덕션에 배포한 첫 번째 Golang 프로젝트이기 때문입니다.
context 에 대한 우리의 의견에도 불구하고 우리는 Golang의 오류 처리가 너무 장황하고 부피가 크다는 데 동의했습니다. 시스템 흐름 자체를 읽는 것보다 더 많은 오류 처리를 읽게 만듭니다. 그런 다음 Java/Kotlin을 사용하여 코딩할 때 오류를 처리하기 위해 항상 throws , throwtry-catch block 를 사용했던 것이 기억납니다.

흠…

Golang용으로 만들지 않는 이유는 무엇입니까?

그런 다음 try-catch block라는 Golang용 taboo 모듈을 만듭니다. 이것이 Golang 개발자들 사이에서 논쟁을 불러일으킨다는 것을 알고 있기 때문에, 한 번 시도해 보는 것이 어떨까 하는 생각이 들었습니다.

디자인 자체는 this article에서 영감을 받았지만 전체 구현은 모두 현재 요구 사항에 맞게 조정되었습니다. 이 모듈은 error 대신 panicrecover를 기반으로 하므로 잘못된 조건에서 사용할 때마다 상당히 위험합니다.

예를 들어 보겠습니다.

package main

func div(a, b int) int {
  return a / b
}

func main() {
  div(10, 0)
}


bzero로 채워지면 패닉이 발생합니다.

panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.div(...)
        /tmp/anon-org/taboo/cmd/example.go:4
main.main()
        /tmp/anon-org/taboo/cmd/example.go:8 +0x12

Process finished with exit code 2



따라서 다음과 같이 taboo를 사용하여 처리할 수 있습니다.

taboo.Try(func() {
  div(10, 0)  
}).Catch(func(e *taboo.Exception) {
  fmt.Println(e.Error())
}).Do()


taboopanic를 잡아서 recover 시도하고 taboo.Exception라는 오류 스택을 만들어 오류를 더 자세하게 추적합니다. 따라서 프로그램은 다음과 같이 종료됩니다.

main.div:9 runtime error: integer divide by zero

Process finished with exit code 0



꽤 편리하죠?

그런 다음 첫 번째 호출자에게 오류를 발생시키거나 다시 발생시키려면 어떻게 해야 합니까?

package main

import (
  "errors"
  "fmt"
  "github.com/anon-org/taboo/pkg/taboo"
)

func div(a, b int) int {
  if b == 0 {
    taboo.Throw(errors.New("division by zero detected"))
  }
  return a / b
}

func callDiv() int {
  var result int

  taboo.Try(func() {
    result = div(10, 0)
  }).Catch(func(e *taboo.Exception) {
    e.Throw("callDiv rethrow this error")
  }).Do()

  return result
}

func callCallDiv() int {
  var result int

  taboo.Try(func() {
    result = callDiv()
  }).Catch(func(e *taboo.Exception) {
    e.Throw("callCallDiv rethrow this error")
  }).Do()

  return result
}

func main() {
  taboo.Try(func() {
    callCallDiv()
  }).Catch(func(e *taboo.Exception) {
    fmt.Println(e.Error())
  }).Do()
}


e.Throw(message) 이전 예외를 래핑하고 이전 호출자에게 다시 던집니다. 따라서 인쇄된 오류는 다음과 같습니다.

main.callCallDiv:34 callCallDiv rethrow this error caused by:
  main.callDiv:22 callDiv rethrow this error caused by:
    main.div:11 division by zero detected

Process finished with exit code 0



Java/Kotlin의 try-catch block와 같지만 많은 결함이 있습니다. 이 모듈은 아직 프로덕션에서 이 모듈을 사용하지 않을 실험입니다. 아니면 해야 할까요?

좋은 웹페이지 즐겨찾기