Log error information when config init fails

This commit is contained in:
Florian Bruhin 2017-09-17 14:13:36 +02:00
parent 884f73f349
commit e4d05e3fec
4 changed files with 33 additions and 5 deletions

View File

@ -665,6 +665,7 @@ def init(parent=None):
if config_api.errors:
raise configexc.ConfigFileErrors('config.py', config_api.errors)
except configexc.ConfigFileErrors as e:
log.config.exception("Error while loading config.py")
errbox = msgbox.msgbox(parent=None,
title="Error while reading config",
text=e.to_html(),
@ -682,6 +683,7 @@ def init(parent=None):
desc = configexc.ConfigErrorDesc("Error", e)
raise configexc.ConfigFileErrors('autoconfig.yml', [desc])
except configexc.ConfigFileErrors as e:
log.config.exception("Error while loading autoconfig.yml")
errbox = msgbox.msgbox(parent=None,
title="Error while reading config",
text=e.to_html(),

View File

@ -19,6 +19,8 @@
"""Exceptions related to config parsing."""
from qutebrowser.utils import utils
class Error(Exception):
@ -87,13 +89,20 @@ class ConfigErrorDesc:
self.exception = exception
self.traceback = traceback
def __repr__(self):
return utils.get_repr(self, text=self.text, exception=self.exception)
def __str__(self):
return '{}: {}'.format(self.text, self.exception)
class ConfigFileErrors(Error):
"""Raised when multiple errors occurred inside the config."""
def __init__(self, basename, errors):
super().__init__("Errors occurred while reading {}".format(basename))
super().__init__("Errors occurred while reading {}:\n{}".format(
basename, '\n'.join(' {}'.format(e) for e in errors)))
self.basename = basename
self.errors = errors

View File

@ -20,6 +20,7 @@
import copy
import types
import logging
import unittest.mock
import pytest
@ -884,7 +885,7 @@ def init_patch(qapp, fake_save_manager, monkeypatch, config_tmpdir,
@pytest.mark.parametrize('config_py', [True, 'error', False])
@pytest.mark.parametrize('invalid_yaml', ['42', 'unknown', False])
# pylint: disable=too-many-branches
def test_init(init_patch, fake_save_manager, config_tmpdir, mocker,
def test_init(init_patch, fake_save_manager, config_tmpdir, mocker, caplog,
load_autoconfig, config_py, invalid_yaml):
# Prepare files
autoconfig_file = config_tmpdir / 'autoconfig.yml'
@ -912,7 +913,8 @@ def test_init(init_patch, fake_save_manager, config_tmpdir, mocker,
msgbox_mock = mocker.patch('qutebrowser.config.config.msgbox.msgbox',
autospec=True)
config.init()
with caplog.at_level(logging.ERROR):
config.init()
# Check error messages
expected_errors = []

View File

@ -20,6 +20,8 @@
import textwrap
import pytest
from qutebrowser.config import configexc
from qutebrowser.utils import usertypes
@ -47,11 +49,24 @@ def test_duplicate_key_error():
assert str(e) == "Duplicate key asdf"
def test_config_file_errors():
@pytest.fixture
def errors():
"""Get a ConfigFileErrors object."""
err1 = configexc.ConfigErrorDesc("Error text 1", Exception("Exception 1"))
err2 = configexc.ConfigErrorDesc("Error text 2", Exception("Exception 2"),
"Fake traceback")
errors = configexc.ConfigFileErrors("config.py", [err1, err2])
return configexc.ConfigFileErrors("config.py", [err1, err2])
def test_config_file_errors_str(errors):
assert str(errors).splitlines() == [
'Errors occurred while reading config.py:',
' Error text 1: Exception 1',
' Error text 2: Exception 2',
]
def test_config_file_errors_html(errors):
html = errors.to_html()
assert textwrap.dedent(html) == textwrap.dedent("""
Errors occurred while reading config.py: