Go용 금기 오류 처리기 만들기
9149 단어 developmentgoerrorsopensource
오류 처리에 도움이 되도록 Golang용this module을 만들었습니다. 이 아이디어는 내 동료가 핸들러에서 서비스로, 저장소로 전달
context
하여 오류 로그를 더 자세히 추적하려고 할 때 나타났습니다. 나는 그것이 context
의 목적이 아니라고 생각했기 때문에 그의 의견에 동의하지 않았습니다. 내가 틀렸거나 그가 틀렸거나 우리 둘 다 틀렸을 수도 있습니다. 이것이 프로덕션에 배포한 첫 번째 Golang 프로젝트이기 때문입니다.context
에 대한 우리의 의견에도 불구하고 우리는 Golang의 오류 처리가 너무 장황하고 부피가 크다는 데 동의했습니다. 시스템 흐름 자체를 읽는 것보다 더 많은 오류 처리를 읽게 만듭니다. 그런 다음 Java/Kotlin을 사용하여 코딩할 때 오류를 처리하기 위해 항상 throws
, throw
및 try-catch block
를 사용했던 것이 기억납니다.흠…
Golang용으로 만들지 않는 이유는 무엇입니까?
그런 다음
try-catch block
라는 Golang용 taboo
모듈을 만듭니다. 이것이 Golang 개발자들 사이에서 논쟁을 불러일으킨다는 것을 알고 있기 때문에, 한 번 시도해 보는 것이 어떨까 하는 생각이 들었습니다.디자인 자체는 this article에서 영감을 받았지만 전체 구현은 모두 현재 요구 사항에 맞게 조정되었습니다. 이 모듈은
error
대신 panic
와 recover
를 기반으로 하므로 잘못된 조건에서 사용할 때마다 상당히 위험합니다.예를 들어 보겠습니다.
package main
func div(a, b int) int {
return a / b
}
func main() {
div(10, 0)
}
b
가 zero
로 채워지면 패닉이 발생합니다.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()
taboo
는 panic
를 잡아서 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
와 같지만 많은 결함이 있습니다. 이 모듈은 아직 프로덕션에서 이 모듈을 사용하지 않을 실험입니다. 아니면 해야 할까요?
Reference
이 문제에 관하여(Go용 금기 오류 처리기 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/clavinjune/creating-taboo-error-handler-for-go-1pg1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)