기본 오류 처리는 error.New("error message")입니다. 이 정보는 오류 유형의 반환 값을 통해 반환됩니다.
권장: golang 튜토리얼
간단한 예:
func hello(name string) (str string, err error) { if name == "" { err = errors.New("name 不能为空") return } str = fmt.Sprintf("hello: %s", name) return }
이 메서드를 호출할 때:
var name = "" str, err := hello(name) if err != nil { fmt.Println(err.Error()) return }
이 기본 오류 처리는 오류 정보 문자열을 가져옵니다.
맞춤형 오류 처리
알람을 처리하기 위해 Alarm.go를 정의합니다.
더 이상 말도 안 되는 소리는 하지 말고 코드만 살펴보겠습니다.
package alarm import ( "encoding/json" "fmt" "ginDemo/common/function" "path/filepath" "runtime" "strings" ) type errorString struct { s string } type errorInfo struct { Time string `json:"time"` Alarm string `json:"alarm"` Message string `json:"message"` Filename string `json:"filename"` Line int `json:"line"` Funcname string `json:"funcname"` } func (e *errorString) Error() string { return e.s } func New (text string) error { alarm("INFO", text) return &errorString{text} } // 发邮件 func Email (text string) error { alarm("EMAIL", text) return &errorString{text} } // 发短信 func Sms (text string) error { alarm("SMS", text) return &errorString{text} } // 发微信 func WeChat (text string) error { alarm("WX", text) return &errorString{text} } // 告警方法 func alarm(level string, str string) { // 当前时间 currentTime := function.GetTimeStr() // 定义 文件名、行号、方法名 fileName, line, functionName := "?", 0 , "?" pc, fileName, line, ok := runtime.Caller(2) if ok { functionName = runtime.FuncForPC(pc).Name() functionName = filepath.Ext(functionName) functionName = strings.TrimPrefix(functionName, ".") } var msg = errorInfo { Time : currentTime, Alarm : level, Message : str, Filename : fileName, Line : line, Funcname : functionName, } jsons, errs := json.Marshal(msg) if errs != nil { fmt.Println("json marshal error:", errs) } errorJsonInfo := string(jsons) fmt.Println(errorJsonInfo) if level == "EMAIL" { // 执行发邮件 } else if level == "SMS" { // 执行发短信 } else if level == "WX" { // 执行发微信 } else if level == "INFO" { // 执行记日志 } }
전화 방법 보기:
package v1 import ( "fmt" "ginDemo/common/alarm" "ginDemo/entity" "github.com/gin-gonic/gin" "net/http" ) func AddProduct(c *gin.Context) { // 获取 Get 参数 name := c.Query("name") var res = entity.Result{} str, err := hello(name) if err != nil { res.SetCode(entity.CODE_ERROR) res.SetMessage(err.Error()) c.JSON(http.StatusOK, res) c.Abort() return } res.SetCode(entity.CODE_SUCCESS) res.SetMessage(str) c.JSON(http.StatusOK, res) } func hello(name string) (str string, err error) { if name == "" { err = alarm.WeChat("name 不能为空") return } str = fmt.Sprintf("hello: %s", name) return }
방문: http://localhost:8080/v1/product/add?name=a
{ "code": 1, "msg": "hello: a", "data": null }
오류가 발생하지 않으며 정보도 출력되지 않습니다.
방문: http://localhost:8080/v1/product/add
{ "code": -1, "msg": "name 不能为空", "data": null }
오류가 발생했으며 출력 정보는 다음과 같습니다.
{"time":"2019-07-23 22:19:17","alarm":"WX","message":"name 不能为空","filename":"绝对路径/ginDemo/router/v1/product.go","line":33,"funcname":"hello"}
panic and Recover
는 프로그램을 실행할 수 없는 경우에만 사용해야 합니다. 계속 실행하면 패닉이 발생하여 오류가 발생합니다.
프로그램에서 패닉이 발생하면 제어를 위해 defer(지연 함수) 내부에서 복구를 호출할 수 있지만 전제 조건이 있으며 동일한 Go 코루틴에서만 수행할 수 있습니다.
의도적인 패닉:
package main import ( "fmt" ) func main() { fmt.Println("-- 1 --") defer func() { if r := recover(); r != nil { fmt.Printf("panic: %s\n", r) } fmt.Println("-- 2 --") }() panic("i am panic") }
출력:
-- 1 -- panic: i am panic -- 2 --
의도하지 않은 패닉:
package main import ( "fmt" ) func main() { fmt.Println("-- 1 --") defer func() { if r := recover(); r != nil { fmt.Printf("panic: %s\n", r) } fmt.Println("-- 2 --") }() var slice = [] int {1, 2, 3, 4, 5} slice[6] = 6 }
출력:
-- 1 -- panic: runtime error: index out of range -- 2 --
위 내용은 golang gin 프레임워크 오류 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!