Show exception stack when handling cmdexc errors.

This commit is contained in:
Florian Bruhin 2016-05-13 07:43:44 +02:00
parent b6abada50a
commit 4a551a6758
4 changed files with 15 additions and 6 deletions

View File

@ -21,6 +21,7 @@
import inspect
import collections
import traceback
from PyQt5.QtWebKit import QWebSettings
@ -493,7 +494,8 @@ class Command:
try:
self.namespace = self.parser.parse_args(args)
except argparser.ArgumentParserError as e:
message.error(win_id, '{}: {}'.format(self.name, e))
message.error(win_id, '{}: {}'.format(self.name, e),
stack=traceback.format_exc())
return
except argparser.ArgumentParserExit as e:
log.commands.debug("argparser exited with status {}: {}".format(

View File

@ -20,6 +20,7 @@
"""Module containing command managers (SearchRunner and CommandRunner)."""
import collections
import traceback
from PyQt5.QtCore import pyqtSlot, QUrl, QObject
@ -264,7 +265,8 @@ class CommandRunner(QObject):
try:
self.run(text, count)
except (cmdexc.CommandMetaError, cmdexc.CommandError) as e:
message.error(self._win_id, e, immediately=True)
message.error(self._win_id, e, immediately=True,
stack=traceback.format_exc())
@pyqtSlot(str, int)
def run_safely_init(self, text, count=None):
@ -276,4 +278,4 @@ class CommandRunner(QObject):
try:
self.run(text, count)
except (cmdexc.CommandMetaError, cmdexc.CommandError) as e:
message.error(self._win_id, e)
message.error(self._win_id, e, stack=traceback.format_exc())

View File

@ -19,6 +19,8 @@
"""Advanced keyparsers."""
import traceback
from qutebrowser.keyinput.basekeyparser import BaseKeyParser
from qutebrowser.utils import message, utils
from qutebrowser.commands import runners, cmdexc
@ -41,7 +43,8 @@ class CommandKeyParser(BaseKeyParser):
try:
self._commandrunner.run(cmdstr, count)
except (cmdexc.CommandMetaError, cmdexc.CommandError) as e:
message.error(self._win_id, e, immediately=True)
message.error(self._win_id, e, immediately=True,
stack=traceback.format_exc())
class PassthroughKeyParser(CommandKeyParser):

View File

@ -116,14 +116,16 @@ def on_focus_changed():
getattr(bridge, msg.method_name)(text, *msg.args, **msg.kwargs)
def error(win_id, message, immediately=False):
def error(win_id, message, immediately=False, *, stack=None):
"""Convenience function to display an error message in the statusbar.
Args:
win_id: The ID of the window which is calling this function.
others: See MessageBridge.error.
stack: The stack trace to show.
"""
stack = ''.join(traceback.format_stack())
if stack is None:
stack = ''.join(traceback.format_stack())
log.message.debug("Error message stack:\n{}".format(stack))
_wrapper(win_id, 'error', message, immediately)