From a0f46bf9b8e729784f7444b3cc9dfffcd1b519b3 Mon Sep 17 00:00:00 2001 From: c9s Date: Wed, 8 Dec 2021 23:30:58 +0800 Subject: [PATCH] improve error checking, avoid using panic inside the constructor --- pkg/backtest/exchange.go | 16 ++++++++-------- pkg/cmd/backtest.go | 6 +++++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pkg/backtest/exchange.go b/pkg/backtest/exchange.go index d7e2c60ad..177b51a78 100644 --- a/pkg/backtest/exchange.go +++ b/pkg/backtest/exchange.go @@ -70,29 +70,29 @@ type Exchange struct { doneC chan struct{} } -func NewExchange(sourceName types.ExchangeName, srv *service.BacktestService, config *bbgo.Backtest) *Exchange { +func NewExchange(sourceName types.ExchangeName, srv *service.BacktestService, config *bbgo.Backtest) (*Exchange, error) { ex, err := newPublicExchange(sourceName) if err != nil { - panic(err) + return nil, err } if config == nil { - panic(errors.New("backtest config can not be nil")) + return nil, errors.New("backtest config can not be nil") } markets, err := bbgo.LoadExchangeMarketsWithCache(context.Background(), ex) if err != nil { - panic(err) + return nil, err } startTime, err := config.ParseStartTime() if err != nil { - panic(err) + return nil, err } endTime, err := config.ParseEndTime() if err != nil { - panic(err) + return nil, err } account := &types.Account{ @@ -119,7 +119,7 @@ func NewExchange(sourceName types.ExchangeName, srv *service.BacktestService, co } e.resetMatchingBooks() - return e + return e, nil } func (e *Exchange) addTrade(trade types.Trade) { @@ -321,5 +321,5 @@ func newPublicExchange(sourceExchange types.ExchangeName) (types.Exchange, error return okex.New("", "", ""), nil } - return nil, fmt.Errorf("exchange %s is not supported", sourceExchange) + return nil, fmt.Errorf("public data from exchange %s is not supported", sourceExchange) } diff --git a/pkg/cmd/backtest.go b/pkg/cmd/backtest.go index e2cfbb41a..0b3999c4d 100644 --- a/pkg/cmd/backtest.go +++ b/pkg/cmd/backtest.go @@ -261,7 +261,11 @@ var BacktestCmd = &cobra.Command{ } } - backtestExchange := backtest.NewExchange(exchangeName, backtestService, userConfig.Backtest) + backtestExchange, err := backtest.NewExchange(exchangeName, backtestService, userConfig.Backtest) + if err != nil { + return errors.Wrap(err, "failed to create backtest exchange") + } + environ.SetStartTime(startTime) environ.AddExchange(exchangeName.String(), backtestExchange)