Chcę utworzyć globalny program obsługi błędów, aby wysłać go pocztą e-mail.globalny moduł obsługi odzyskiwania dla golang http panic
package main
import (
"github.com/gorilla/mux"
"log"
"net/http"
)
func main() {
rtr := mux.NewRouter()
rtr.HandleFunc("/", withPanic).Methods("GET")
http.Handle("/", rtr)
log.Println("Listening...")
http.ListenAndServe(":3001", http.DefaultServeMux)
}
func withPanic(w http.ResponseWriter, r *http.Request) {
panic("somewhere here will be panic, but I don't know where exactly")
}
Jak zrobić to globalnie. Byłoby łatwo, gdybym wiedział, gdzie wystąpi błąd:
if err != nil {
sendMeMail(err)
}
Ale co zrobić w przypadku, gdy nie wiem dokładnie, gdzie wystąpi błąd? Więc powinienem dodać globalny program obsługi ish z obsługą recover
. Ale jak to zrobić dokładnie nie wiem.
Aktualizacja
dodałem defer recover
do początku main
ale nigdy nie wykonuje na zainteresowanie http://localhost:3001
. Więc panika nie jest wysyłana pocztą elektroniczną.
package main
import (
"errors"
"fmt"
"github.com/gorilla/mux"
"log"
"net/http"
)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
// find out exactly what the error was and set err
var err error
switch x := r.(type) {
case string:
err = errors.New(x)
case error:
err = x
default:
err = errors.New("Unknown panic")
}
if err != nil {
// sendMeMail(err)
fmt.Println("sendMeMail")
}
}
}()
rtr := mux.NewRouter()
rtr.HandleFunc("/", withPanic).Methods("GET")
http.Handle("/", rtr)
log.Println("Listening...")
http.ListenAndServe(":3001", http.DefaultServeMux)
}
func withPanic(w http.ResponseWriter, r *http.Request) {
panic("somewhere here will be panic, but I don't know where exactly")
}
e.Error() powinien być err.Error()? –
naprawiono @eyeAppsLLC. – tarrsalah
Naprawdę podoba mi się rozwiązanie, działa dla mnie :) – Danie