Codebase list golang-github-vbauerster-mpb / 19c5049
refactoring: bar panic recover Vladimir Bauer 7 years ago
1 changed file(s) with 15 addition(s) and 12 deletion(s). Raw diff Collapse all Expand all
5656 }
5757
5858 dlogger *log.Logger
59 bpanic interface{}
5960 }
6061
6162 type bState struct {
7576 shutdownListeners []decor.ShutdownListener
7677 bufP, bufB, bufA *bytes.Buffer
7778 bufE *bytes.Buffer
78 panicMsg string
7979
8080 // priority overrides *Bar's priority, if set
8181 priority int
267267 }
268268
269269 func (b *Bar) render(debugOut io.Writer, tw int) {
270 if b.bpanic != nil {
271 b.toShutdown = false
272 b.frameCh <- b.panicToFrame(tw)
273 return
274 }
270275 select {
271276 case b.operateState <- func(s *bState) {
272277 defer func() {
273278 // recovering if user defined decorator panics for example
274279 if p := recover(); p != nil {
275280 b.dlogger.Println(p)
276 s.panicMsg = fmt.Sprintf("panic: %v", p)
277 close(b.shutdown)
278 b.frameCh <- s.drawPanic(tw)
281 b.bpanic = p
282 b.toShutdown = !s.completeFlushed
283 b.frameCh <- b.panicToFrame(tw)
279284 }
280285 }()
281286
282287 frame := s.draw(tw)
283 b.toShutdown = s.toComplete && !s.completeFlushed
284 s.completeFlushed = s.toComplete
285288
286289 if s.extender != nil {
287290 s.extender.Fill(s.bufE, tw, newStatistics(s))
288291 b.extendedLines = countLines(s.bufE.Bytes())
289292 frame = io.MultiReader(frame, s.bufE)
290293 }
294
295 b.toShutdown = s.toComplete && !s.completeFlushed
296 s.completeFlushed = s.toComplete
297
291298 b.frameCh <- frame
292299 }:
293300 case <-b.done:
294301 s := b.cacheState
295 if s.panicMsg != "" {
296 b.frameCh <- s.drawPanic(tw)
297 return
298 }
299302 frame := s.draw(tw)
300303 if s.extender != nil {
301304 s.extender.Fill(s.bufE, tw, newStatistics(s))
306309 }
307310 }
308311
309 func (s *bState) drawPanic(termWidth int) io.Reader {
310 return strings.NewReader(fmt.Sprintf(fmt.Sprintf("%%.%ds\n", termWidth), s.panicMsg))
312 func (b *Bar) panicToFrame(termWidth int) io.Reader {
313 return strings.NewReader(fmt.Sprintf(fmt.Sprintf("%%.%dv\n", termWidth), b.bpanic))
311314 }
312315
313316 func (s *bState) draw(termWidth int) io.Reader {