From 0bc96241d583bdc6e6697aaa7e95a7a77516867d Mon Sep 17 00:00:00 2001 From: gcarq Date: Thu, 16 Nov 2017 16:14:43 +0100 Subject: [PATCH] rework exception handling (fixes #108) --- freqtrade/main.py | 13 +++++++------ freqtrade/misc.py | 4 ++++ freqtrade/tests/test_main.py | 6 +++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/freqtrade/main.py b/freqtrade/main.py index d44478d7d..64a758bea 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -14,7 +14,8 @@ from jsonschema import validate from freqtrade import __version__, exchange, persistence from freqtrade.analyze import get_buy_signal -from freqtrade.misc import CONF_SCHEMA, State, get_state, update_state, build_arg_parser, throttle +from freqtrade.misc import CONF_SCHEMA, State, get_state, update_state, build_arg_parser, throttle, \ + FreqtradeException from freqtrade.persistence import Trade from freqtrade.rpc import telegram @@ -76,8 +77,8 @@ def _process(dynamic_whitelist: Optional[bool] = False) -> bool: 'Checked all whitelisted currencies. ' 'Found no suitable entry positions for buying. Will keep looking ...' ) - except ValueError: - logger.exception('Unable to create trade') + except FreqtradeException as e: + logger.warning('Unable to create trade: %s', e) for trade in trades: # Get order details for actual price per unit @@ -93,7 +94,7 @@ def _process(dynamic_whitelist: Optional[bool] = False) -> bool: Trade.session.flush() except (requests.exceptions.RequestException, json.JSONDecodeError) as error: msg = 'Got {} in _process(), retrying in 30 seconds...'.format(error.__class__.__name__) - logger.exception(msg) + logger.warning(msg) time.sleep(30) except RuntimeError: telegram.send_msg('*Status:* Got RuntimeError:\n```\n{traceback}```{hint}'.format( @@ -206,7 +207,7 @@ def create_trade(stake_amount: float) -> Optional[Trade]: whitelist = copy.deepcopy(_CONF['exchange']['pair_whitelist']) # Check if stake_amount is fulfilled if exchange.get_balance(_CONF['stake_currency']) < stake_amount: - raise ValueError( + raise FreqtradeException( 'stake amount is not fulfilled (currency={})'.format(_CONF['stake_currency']) ) @@ -216,7 +217,7 @@ def create_trade(stake_amount: float) -> Optional[Trade]: whitelist.remove(trade.pair) logger.debug('Ignoring %s in pair whitelist', trade.pair) if not whitelist: - raise ValueError('No pair in whitelist') + raise FreqtradeException('No pair in whitelist') # Pick pair based on StochRSI buy signals for _pair in whitelist: diff --git a/freqtrade/misc.py b/freqtrade/misc.py index 35e67a976..85c51aa71 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -11,6 +11,10 @@ from freqtrade import __version__ logger = logging.getLogger(__name__) +class FreqtradeException(BaseException): + pass + + class State(enum.Enum): RUNNING = 0 STOPPED = 1 diff --git a/freqtrade/tests/test_main.py b/freqtrade/tests/test_main.py index 6314a919c..74a776f22 100644 --- a/freqtrade/tests/test_main.py +++ b/freqtrade/tests/test_main.py @@ -9,7 +9,7 @@ from sqlalchemy import create_engine from freqtrade.exchange import Exchanges from freqtrade.main import create_trade, handle_trade, close_trade_if_fulfilled, init, \ get_target_bid, _process -from freqtrade.misc import get_state, State +from freqtrade.misc import get_state, State, FreqtradeException from freqtrade.persistence import Trade @@ -139,7 +139,7 @@ def test_create_trade_no_stake_amount(default_conf, ticker, mocker): get_ticker=ticker, buy=MagicMock(return_value='mocked_limit_buy'), get_balance=MagicMock(return_value=default_conf['stake_amount'] * 0.5)) - with pytest.raises(ValueError, match=r'.*stake amount.*'): + with pytest.raises(FreqtradeException, match=r'.*stake amount.*'): create_trade(default_conf['stake_amount']) @@ -152,7 +152,7 @@ def test_create_trade_no_pairs(default_conf, ticker, mocker): get_ticker=ticker, buy=MagicMock(return_value='mocked_limit_buy')) - with pytest.raises(ValueError, match=r'.*No pair in whitelist.*'): + with pytest.raises(FreqtradeException, match=r'.*No pair in whitelist.*'): conf = copy.deepcopy(default_conf) conf['exchange']['pair_whitelist'] = [] mocker.patch.dict('freqtrade.main._CONF', conf)