이동으로 웹 응용 프로그램을 작성하고 있습니다. 대부분의 오류를 API에서 패닉으로 변환 한 다음 상위 수준의 기능에서 이러한 패닉을 잡아 로그에 기록하고 오류 페이지를 사용자에게 반환하려고합니다. 이 같은웹 응용 프로그램에서 패닉 사용
뭔가 :
func Handler(body func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
return func(responseWriter http.ResponseWriter, request *http.Request) {
defer recoverIfPanic(responseWriter, request)
body(responseWriter, request)
}
}
func recoverIfPanic(responseWriter http.ResponseWriter, request *http.Request) {
reason := recover()
if reason == nil {
return
}
// log and return http error
}
func PanicIf(err error, httpStatus int, description string) {
if error != nil {
panic(MyPanicStruct{err: err, httpStatus: httpStatus, description: description})
}
}
내 실제 코드에서
result, err := SomeApi(...)
PanicIf(err, http.StatusInternalServerError, "SomeApi")
99 %의 경우 난 아무것도 할 수 없습니다 합리적인 경우, 예를 들어, SQL 서버가 예기치 않은 오류를 반환하거나 파일 시스템에서 파일이 누락되었습니다.이 상황을 기록하고 오류를 사용자에게 반환하는 것이 좋습니다. 그래서 나는 수동으로 unwrinding 스택을 반환해야하는 이유를 볼 수 없다. 실제로 stacktrace와 컨텍스트를 잃어 버리게되고 오류 이유를 찾기가 더 어려워 질 것이다.
내가 놓친 것이 있습니까?이 방법이 효과가 없을 수 있습니까? 대부분의 Go 관련 기사가 공황/회복을 사용하지 말 것을 권장하는 것 같지만 그 이유는 알 수 없습니다. Java (및 유사한 언어)에서의 오래된 throw-catch 메커니즘과 똑같아 보이며 웹 응용 프로그램에 완벽하게 작동합니다.