62 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package middleware
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"net/http"
							 | 
						||
| 
								 | 
							
									"runtime"
							 | 
						||
| 
								 | 
							
									"strconv"
							 | 
						||
| 
								 | 
							
									"strings"
							 | 
						||
| 
								 | 
							
									"time"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/gin-gonic/gin"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func CustomError(c *gin.Context) {
							 | 
						||
| 
								 | 
							
									defer func() {
							 | 
						||
| 
								 | 
							
										if err := recover(); err != nil {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if c.IsAborted() {
							 | 
						||
| 
								 | 
							
												c.Status(200)
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											switch errStr := err.(type) {
							 | 
						||
| 
								 | 
							
											case string:
							 | 
						||
| 
								 | 
							
												p := strings.Split(errStr, "#")
							 | 
						||
| 
								 | 
							
												if len(p) == 3 && p[0] == "CustomError" {
							 | 
						||
| 
								 | 
							
													statusCode, e := strconv.Atoi(p[1])
							 | 
						||
| 
								 | 
							
													if e != nil {
							 | 
						||
| 
								 | 
							
														break
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													c.Status(statusCode)
							 | 
						||
| 
								 | 
							
													fmt.Println(
							 | 
						||
| 
								 | 
							
														time.Now().Format("2006-01-02 15:04:05"),
							 | 
						||
| 
								 | 
							
														"[ERROR]",
							 | 
						||
| 
								 | 
							
														c.Request.Method,
							 | 
						||
| 
								 | 
							
														c.Request.URL,
							 | 
						||
| 
								 | 
							
														statusCode,
							 | 
						||
| 
								 | 
							
														c.Request.RequestURI,
							 | 
						||
| 
								 | 
							
														c.ClientIP(),
							 | 
						||
| 
								 | 
							
														p[2],
							 | 
						||
| 
								 | 
							
													)
							 | 
						||
| 
								 | 
							
													c.JSON(http.StatusOK, gin.H{
							 | 
						||
| 
								 | 
							
														"code": statusCode,
							 | 
						||
| 
								 | 
							
														"msg":  p[2],
							 | 
						||
| 
								 | 
							
													})
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
													c.JSON(http.StatusOK, gin.H{
							 | 
						||
| 
								 | 
							
														"code": 500,
							 | 
						||
| 
								 | 
							
														"msg":  errStr,
							 | 
						||
| 
								 | 
							
													})
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											case runtime.Error:
							 | 
						||
| 
								 | 
							
												c.JSON(http.StatusOK, gin.H{
							 | 
						||
| 
								 | 
							
													"code": 500,
							 | 
						||
| 
								 | 
							
													"msg":  errStr.Error(),
							 | 
						||
| 
								 | 
							
												})
							 | 
						||
| 
								 | 
							
											default:
							 | 
						||
| 
								 | 
							
												panic(err)
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
									c.Next()
							 | 
						||
| 
								 | 
							
								}
							 |