Tôi muốn tạo trình xử lý lỗi toàn cục để gửi nó qua email.Trình xử lý khôi phục toàn cầu cho 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")
}
Làm thế nào để làm cho nó toàn cầu. Sẽ dễ dàng nếu tôi biết lỗi nào sẽ xảy ra
if err != nil {
sendMeMail(err)
}
Nhưng phải làm gì trong trường hợp tôi không biết chính xác một lỗi xảy ra ở đâu? Vì vậy, tôi nên thêm một trình xử lý ish toàn cầu recover
. Nhưng làm thế nào để làm điều đó chính xác tôi không biết.
Cập nhật
tôi thêm defer recover
đến đầu main
nhưng nó không bao giờ thực thi trên yêu cầu http://localhost:3001
. Vì vậy, hoảng loạn không được gửi qua email.
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() phải là err.Error()? –
cố định @eyeAppsLLC. – tarrsalah
thực sự thích giải pháp, hoạt động cho tôi :) – Danie