goroutine.go 505 B

12345678910111213141516171819202122232425262728293031
  1. package util
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func GoWithRecover(handler func(), recoverHandler func(r interface{})) {
  7. if handler == nil {
  8. return
  9. }
  10. go func() {
  11. defer func() {
  12. if r := recover(); r != nil {
  13. if recoverHandler == nil {
  14. fmt.Fprintf(os.Stderr, "panic:\n %v\n", r)
  15. return
  16. }
  17. go func() {
  18. defer func() {
  19. if r := recover(); r != nil {
  20. fmt.Fprintf(os.Stderr, "panic:\n %v\n", r)
  21. }
  22. }()
  23. recoverHandler(r)
  24. }()
  25. }
  26. }()
  27. handler()
  28. }()
  29. }