Codebase list golang-github-vbauerster-mpb / 59ccdf3
makePanicExtender Vladimir Bauer 6 years ago
1 changed file(s) with 21 addition(s) and 21 deletion(s). Raw diff Collapse all Expand all
304304 defer func() {
305305 // recovering if user defined decorator panics for example
306306 if p := recover(); p != nil {
307 var sb strings.Builder
308 fmt.Fprintf(&sb, "%#v\n", stat)
309 sb.Write(debug.Stack())
310 stack := sb.String()
311 nlc := strings.Count(stack, "\n")
312 s.extender = func(r io.Reader, _ int, _ decor.Statistics) (io.Reader, int) {
313 return io.MultiReader(r, strings.NewReader(stack)), nlc
314 }
307 go b.dlogger.Println(p)
308 s.extender = makePanicExtender(p)
309 frame, lines := s.extender(nil, s.reqWidth, stat)
310 b.extendedLines = lines
311 b.toShutdown = true
315312 b.recoveredPanic = p
316 b.extendedLines = nlc
317 b.toShutdown = true
318 b.frameCh <- io.MultiReader(b.panicToFrame(tw), strings.NewReader(stack))
319 b.dlogger.Println(p)
313 b.frameCh <- frame
320314 }
321315 }()
322
323316 frame, lines := s.extender(s.draw(stat), s.reqWidth, stat)
324317 b.extendedLines = lines
325
326318 b.toShutdown = s.toComplete && !s.completeFlushed
327319 s.completeFlushed = s.toComplete
328320 b.frameCh <- frame
331323 s := b.cacheState
332324 stat := newStatistics(tw, s)
333325 var r io.Reader
334 if b.recoveredPanic != nil {
335 r = b.panicToFrame(tw)
336 } else {
326 if b.recoveredPanic == nil {
337327 r = s.draw(stat)
338328 }
339329 frame, lines := s.extender(r, s.reqWidth, stat)
340330 b.extendedLines = lines
341331 b.frameCh <- frame
342332 }
343 }
344
345 func (b *Bar) panicToFrame(tw int) io.Reader {
346 return strings.NewReader(runewidth.Truncate(fmt.Sprint(b.recoveredPanic), tw, "…") + "\n")
347333 }
348334
349335 func (b *Bar) subscribeDecorators() {
475461 d.EwmaUpdate(s.lastN, dur)
476462 }
477463 }
464
465 func makePanicExtender(p interface{}) extFunc {
466 pstr := fmt.Sprint(p)
467 stack := debug.Stack()
468 stackLines := bytes.Count(stack, []byte("\n"))
469 return func(_ io.Reader, _ int, st decor.Statistics) (io.Reader, int) {
470 mr := io.MultiReader(
471 strings.NewReader(runewidth.Truncate(pstr, st.AvailableWidth, "…")),
472 strings.NewReader(fmt.Sprintf("\n%#v\n", st)),
473 bytes.NewReader(stack),
474 )
475 return mr, stackLines + 1
476 }
477 }