나는 학습 중이며 외부 패키지에서 패닉을 제대로 처리하는 방법을 이해하려고합니다.외부 패키지에서 비동기 패닉을 복구하는 방법
실행 가능한 예제입니다. 패키지가 doFoo
메서드를 정의한다고 가정 해보십시오. 서버 충돌 할 doFoo의 메소드를 호출
package main
import (
"log"
"net/http"
"sync"
"time"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
)
// Method from External package
func doFoo() {
var wg sync.WaitGroup
wg.Add(1)
// Do some cool async stuff
go func() {
time.Sleep(500)
wg.Done()
panic("Oops !")
}()
}
func router() *mux.Router {
var router = mux.NewRouter().StrictSlash(true)
router.HandleFunc("/doFoo", index).Methods("GET")
return router
}
func main() {
log.Fatal(http.ListenAndServe(":8080", handlers.RecoveryHandler()(router())))
}
func index(w http.ResponseWriter, r *http.Request) {
defer func() {
recover()
w.WriteHeader(http.StatusInternalServerError)
}()
doFoo()
w.WriteHeader(http.StatusOK)
}
(그것은 예를 위해 여기에 같은 패키지에있는 것), 나는 응용 프로그램이 훼손 상태가 지금이기 때문에 즉, 올바른 동작입니다 주셔서 감사합니다. 충돌이 발생하여 후속 요청이 일부 부하 분산 장치를 통해 다른 프로세스로 전달되도록하는 것이 가장 좋습니다. 하지만 내 api 서버가 여전히 다른 클라이언트에게 서비스를 제공하고 있으며 웹 소켓을 유지 관리하고있을 수도 있습니다. 여기에 500 개의 오류도 반환하려고합니다.
nodejs에서 오는 것은 uncaughtException
의 개념에 따라 캡처되지 않은 동기 예외를 처리하는 데 익숙하지 않은데 unhandledRejection
은 캡처되지 않은 비동기 예외를 처리하는 데 익숙합니다. 이 두 프로세스 구조는 개발자가 프로그램을 즉시 중단하거나 오류를 기록하고 적절한 http 코드를 반환 한 다음 필요할 경우 정상적으로 종료하도록 선택할 수 있습니다.
제 온라인 연구에서 나는 공포가 예외가 아니고, 특이한 것이 아니라, 당신이 그들에 대해 걱정할 필요가 없다는 많은 리소스를 발견했습니다. 그러나 코드를 작성할 때 공포감을 일으키는 것은 실제로 매우 쉽습니다. 자신의 도서관이 당황하지 않도록하는 것은 개발자의 몫입니다. 인간의 요소는 여기에 100 % 참여했습니다.
이것은 궁금해합니다. 모든 패키지 의존성을 포함하여 사용하려는 모든 단일 패키지의 전체 코드베이스를 감사해야합니까?? 내 모든 서버를 다운 시켜서 내 사용자의 경험을 망칠 수있는 일부 외부 패키지에서 누락 복구를 방지 할 수단이 없기 때문에?
또는 비동기 패닉이 라이브러리 코드에서 발생할 때 정상적으로 실패 할 수 있다는 것을 모르는 전략이 있습니까?
1.8 이후로 정상 종료가 확인되었지만 내 프로그램이 이미 충돌했기 때문에 사용할 수 없습니다. https://golang.org/pkg/net/http/#Server.Shutdown
고릴라 복구 핸들러가 있지만, 이것은 동기 패닉에 대해서만 보호합니다. http://www.gorillatoolkit.org/pkg/handlers#RecoveryHandler
업데이트 :
내가 패닉이 예외가 아니라는 것을 알고 있습니다. 그 질문에 대답하지 않는 재시험, 공포와 예외는이 질문에 관한 것이 아닙니다. 이 질문은 전체 패키지 트리의 모든 단일 행을 개발자에게 읽지 않아도 언어가 경계를 강화하기 위해 제공 할 수있는 도구를 이해하는 것입니다. 그것이 언어에서 가능하지 않다면 그 말이 유효한 대답이라는 것을 나타냅니다. 그것이 맞는지 아닌지 나는 모른다.
간단히 말해서, 당신은하지 않습니다. 예기치 않은 패닉이 응용 프로그램을 중단시키고 예상되는 코스가 다시 시작됩니다. – JimB