code: func Catch(cb func(p *Panic)) {
  	if reason := recover(); reason != nil && cb != nil {
  		stack := make([]byte, maxStackBufferSize)
  		count := runtime.Stack(stack, true)
  		cb(&Panic{
  			Reason: reason,
  			Stack:  string(stack[:count]),
  		})
  	}
  }
docs: // Catch recovers from panic. It should be used as a deferred call.
  //
  // If the supplied panic callback is nil, the panic will be silently discarded.
  // Otherwise, the callback will be invoked with the panic's information.