From c560de41113c749de0b4f3ab6d7a0c155150486e Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 8 May 2020 11:44:24 +0200 Subject: [PATCH 1/3] Improve exception handling on critical errors --- freqtrade/commands/trade_commands.py | 3 +++ tests/commands/test_commands.py | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/freqtrade/commands/trade_commands.py b/freqtrade/commands/trade_commands.py index 352fac26d..c058e4f9d 100644 --- a/freqtrade/commands/trade_commands.py +++ b/freqtrade/commands/trade_commands.py @@ -18,6 +18,9 @@ def start_trading(args: Dict[str, Any]) -> int: try: worker = Worker(args) worker.run() + except Exception as e: + logger.error(str(e)) + logger.exception("Fatal exception!") except KeyboardInterrupt: logger.info('SIGINT received, aborting ...') finally: diff --git a/tests/commands/test_commands.py b/tests/commands/test_commands.py index 93b123069..46350beff 100644 --- a/tests/commands/test_commands.py +++ b/tests/commands/test_commands.py @@ -32,7 +32,7 @@ def test_setup_utils_configuration(): assert config['exchange']['secret'] == '' -def test_start_trading_fail(mocker): +def test_start_trading_fail(mocker, caplog): mocker.patch("freqtrade.worker.Worker.run", MagicMock(side_effect=OperationalException)) @@ -43,16 +43,15 @@ def test_start_trading_fail(mocker): 'trade', '-c', 'config.json.example' ] - with pytest.raises(OperationalException): - start_trading(get_args(args)) + start_trading(get_args(args)) assert exitmock.call_count == 1 exitmock.reset_mock() - + caplog.clear() mocker.patch("freqtrade.worker.Worker.__init__", MagicMock(side_effect=OperationalException)) - with pytest.raises(OperationalException): - start_trading(get_args(args)) + start_trading(get_args(args)) assert exitmock.call_count == 0 + assert log_has('Fatal exception!', caplog) def test_list_exchanges(capsys): From 5272ec85eab94d2d0fb801050429a766e6011058 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 8 May 2020 12:34:24 +0200 Subject: [PATCH 2/3] Add additional test --- tests/test_main.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index 70b784002..a7180a5d2 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -115,6 +115,28 @@ def test_main_operational_exception(mocker, default_conf, caplog) -> None: assert log_has('Oh snap!', caplog) +def test_main_operational_exception1(mocker, default_conf, caplog) -> None: + patch_exchange(mocker) + mocker.patch( + 'freqtrade.commands.list_commands.available_exchanges', + MagicMock(side_effect=ValueError('Oh snap!')) + ) + patched_configuration_load_config_file(mocker, default_conf) + + args = ['list-exchanges'] + + # Test Main + the KeyboardInterrupt exception + with pytest.raises(SystemExit): + main(args) + + assert log_has('Fatal exception!', caplog) + assert not log_has_re(r'SIGINT.*', caplog) + mocker.patch( + 'freqtrade.commands.list_commands.available_exchanges', + MagicMock(side_effect=KeyboardInterrupt) + ) + + def test_main_reload_conf(mocker, default_conf, caplog) -> None: patch_exchange(mocker) mocker.patch('freqtrade.freqtradebot.FreqtradeBot.cleanup', MagicMock()) From 80d367fa0871d5ec16bba77312581cf6115a08f0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 8 May 2020 14:24:30 +0200 Subject: [PATCH 3/3] Add test for keyboardinterrupt --- tests/test_main.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index a7180a5d2..11d0ede3a 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -135,6 +135,10 @@ def test_main_operational_exception1(mocker, default_conf, caplog) -> None: 'freqtrade.commands.list_commands.available_exchanges', MagicMock(side_effect=KeyboardInterrupt) ) + with pytest.raises(SystemExit): + main(args) + + assert log_has_re(r'SIGINT.*', caplog) def test_main_reload_conf(mocker, default_conf, caplog) -> None: