Golang Panic处理

获取 recover 的 Panic 信息

适用于 recover 之后查看具体的调用栈

func panicTrace(kb int) []byte {  
   s := []byte("/src/runtime/panic.go")  
   e := []byte("\ngoroutine ")  
   line := []byte("\n")  
   stack := make([]byte, kb<<10) //4KB  
   length := runtime.Stack(stack, true)  
   start := bytes.Index(stack, s)  
   stack = stack[start:length]  
   start = bytes.Index(stack, line) + 1  
   stack = stack[start:]  
   end := bytes.LastIndex(stack, line)  
   if end != -1 {  
      stack = stack[:end]  
   }  
   end = bytes.Index(stack, e)  
   if end != -1 {  
      stack = stack[:end]  
   }  
   stack = bytes.TrimRight(stack, "\n")  
   return stack  
}

将 Panic 错误保存在文件中

适用于不知道何时会 panic 的情况,应该写在程序开头

// RewriteStderrFile 将标准错误保存到stderr中  
func RewriteStderrFile() error {  
   if runtime.GOOS == "windows" {  
      return nil  
   }  
  
   stdErrFile := fmt.Sprintf("%s/stderr.log", LogPath)  
  
   file, err := os.OpenFile(stdErrFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)  
   if err != nil {  
      return err  
   }  
  
   stdErrFileHandler = file  
  
   if err = syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())); err != nil {  
      return err  
   }  
  
   // 内存回收前关闭文件描述符  
   runtime.SetFinalizer(stdErrFileHandler, func(fd *os.File) {  
      fd.Close()  
   })  
  
   return nil  
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值