Skip to content

Commit

Permalink
Close sphinx-doc#8813: Show what extension caused it on errors on eve…
Browse files Browse the repository at this point in the history
…nt handler

Show the module name of the event handler on the error inside it to let
users know a hint of the error.
  • Loading branch information
tk0miya committed Feb 4, 2021
1 parent 50717a2 commit 37590e9
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ Features added
dedent via no-argument ``:dedent:`` option
* C++, also hyperlink operator overloads in expressions and alias declarations.
* #8247: Allow production lists to refer to tokens from other production groups
* #8813: Show what extension (or module) caused it on errors on event handler

Bugs fixed
----------
Expand Down
11 changes: 9 additions & 2 deletions sphinx/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,19 @@ class ApplicationError(SphinxError):

class ExtensionError(SphinxError):
"""Extension error."""
category = 'Extension error'

def __init__(self, message: str, orig_exc: Exception = None) -> None:
def __init__(self, message: str, orig_exc: Exception = None, modname: str = None) -> None:
super().__init__(message)
self.message = message
self.orig_exc = orig_exc
self.modname = modname

@property
def category(self) -> str: # type: ignore
if self.modname:
return 'Extension error (%s)' % self.modname
else:
return 'Extension error'

def __repr__(self) -> str:
if self.orig_exc:
Expand Down
4 changes: 3 additions & 1 deletion sphinx/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from sphinx.errors import ExtensionError, SphinxError
from sphinx.locale import __
from sphinx.util import logging
from sphinx.util.inspect import safe_getattr

if False:
# For type annotation
Expand Down Expand Up @@ -114,8 +115,9 @@ def emit(self, name: str, *args: Any,
except SphinxError:
raise
except Exception as exc:
modname = safe_getattr(listener.handler, '__module__', None)
raise ExtensionError(__("Handler %r for event %r threw an exception") %
(listener.handler, name), exc) from exc
(listener.handler, name), exc, modname=modname) from exc
return results

def emit_firstresult(self, name: str, *args: Any,
Expand Down

0 comments on commit 37590e9

Please sign in to comment.