mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Merge pull request #7832 from cool-RR/2020-06-11-raise-from
Fix exception causes all over the codebase
This commit is contained in:
commit
e4c3e24e85
@ -278,7 +278,7 @@ class MessageCatalogBuilder(I18nBuilder):
|
|||||||
origin = MsgOrigin(template, line)
|
origin = MsgOrigin(template, line)
|
||||||
self.catalogs['sphinx'].add(msg, origin)
|
self.catalogs['sphinx'].add(msg, origin)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise ThemeError('%s: %r' % (template, exc))
|
raise ThemeError('%s: %r' % (template, exc)) from exc
|
||||||
|
|
||||||
def build(self, docnames: Iterable[str], summary: str = None, method: str = 'update') -> None: # NOQA
|
def build(self, docnames: Iterable[str], summary: str = None, method: str = 'update') -> None: # NOQA
|
||||||
self._extract_from_template()
|
self._extract_from_template()
|
||||||
|
@ -140,7 +140,7 @@ class BuildInfo:
|
|||||||
build_info.tags_hash = lines[3].split()[1].strip()
|
build_info.tags_hash = lines[3].split()[1].strip()
|
||||||
return build_info
|
return build_info
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise ValueError(__('build info file is broken: %r') % exc)
|
raise ValueError(__('build info file is broken: %r') % exc) from exc
|
||||||
|
|
||||||
def __init__(self, config: Config = None, tags: Tags = None, config_categories: List[str] = []) -> None: # NOQA
|
def __init__(self, config: Config = None, tags: Tags = None, config_categories: List[str] = []) -> None: # NOQA
|
||||||
self.config_hash = ''
|
self.config_hash = ''
|
||||||
@ -1015,7 +1015,7 @@ class StandaloneHTMLBuilder(Builder):
|
|||||||
return
|
return
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise ThemeError(__("An error happened in rendering the page %s.\nReason: %r") %
|
raise ThemeError(__("An error happened in rendering the page %s.\nReason: %r") %
|
||||||
(pagename, exc))
|
(pagename, exc)) from exc
|
||||||
|
|
||||||
if not outfilename:
|
if not outfilename:
|
||||||
outfilename = self.get_outfilename(pagename)
|
outfilename = self.get_outfilename(pagename)
|
||||||
|
@ -87,10 +87,12 @@ class UserTheme(Theme):
|
|||||||
try:
|
try:
|
||||||
value = self.config.get('theme', key)
|
value = self.config.get('theme', key)
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
except configparser.NoSectionError:
|
except configparser.NoSectionError as exc:
|
||||||
raise ThemeError(__('%r doesn\'t have "theme" setting') % filename)
|
raise ThemeError(__('%r doesn\'t have "theme" setting') %
|
||||||
|
filename) from exc
|
||||||
except configparser.NoOptionError as exc:
|
except configparser.NoOptionError as exc:
|
||||||
raise ThemeError(__('%r doesn\'t have "%s" setting') % (filename, exc.args[0]))
|
raise ThemeError(__('%r doesn\'t have "%s" setting') %
|
||||||
|
(filename, exc.args[0])) from exc
|
||||||
|
|
||||||
for key in self.OPTIONAL_CONFIG_KEYS:
|
for key in self.OPTIONAL_CONFIG_KEYS:
|
||||||
try:
|
try:
|
||||||
|
@ -196,9 +196,9 @@ class Config:
|
|||||||
elif isinstance(defvalue, int):
|
elif isinstance(defvalue, int):
|
||||||
try:
|
try:
|
||||||
return int(value)
|
return int(value)
|
||||||
except ValueError:
|
except ValueError as exc:
|
||||||
raise ValueError(__('invalid number %r for config value %r, ignoring') %
|
raise ValueError(__('invalid number %r for config value %r, ignoring') %
|
||||||
(value, name))
|
(value, name)) from exc
|
||||||
elif hasattr(defvalue, '__call__'):
|
elif hasattr(defvalue, '__call__'):
|
||||||
return value
|
return value
|
||||||
elif defvalue is not None and not isinstance(defvalue, str):
|
elif defvalue is not None and not isinstance(defvalue, str):
|
||||||
@ -319,17 +319,17 @@ def eval_config_file(filename: str, tags: Tags) -> Dict[str, Any]:
|
|||||||
execfile_(filename, namespace)
|
execfile_(filename, namespace)
|
||||||
except SyntaxError as err:
|
except SyntaxError as err:
|
||||||
msg = __("There is a syntax error in your configuration file: %s\n")
|
msg = __("There is a syntax error in your configuration file: %s\n")
|
||||||
raise ConfigError(msg % err)
|
raise ConfigError(msg % err) from err
|
||||||
except SystemExit:
|
except SystemExit as exc:
|
||||||
msg = __("The configuration file (or one of the modules it imports) "
|
msg = __("The configuration file (or one of the modules it imports) "
|
||||||
"called sys.exit()")
|
"called sys.exit()")
|
||||||
raise ConfigError(msg)
|
raise ConfigError(msg) from exc
|
||||||
except ConfigError:
|
except ConfigError:
|
||||||
# pass through ConfigError from conf.py as is. It will be shown in console.
|
# pass through ConfigError from conf.py as is. It will be shown in console.
|
||||||
raise
|
raise
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
msg = __("There is a programmable error in your configuration file:\n\n%s")
|
msg = __("There is a programmable error in your configuration file:\n\n%s")
|
||||||
raise ConfigError(msg % traceback.format_exc())
|
raise ConfigError(msg % traceback.format_exc()) from exc
|
||||||
|
|
||||||
return namespace
|
return namespace
|
||||||
|
|
||||||
|
@ -2301,7 +2301,8 @@ class DefinitionParser(BaseParser):
|
|||||||
errs = []
|
errs = []
|
||||||
errs.append((exCast, "If type cast expression"))
|
errs.append((exCast, "If type cast expression"))
|
||||||
errs.append((exUnary, "If unary expression"))
|
errs.append((exUnary, "If unary expression"))
|
||||||
raise self._make_multi_error(errs, "Error in cast expression.")
|
raise self._make_multi_error(errs,
|
||||||
|
"Error in cast expression.") from exUnary
|
||||||
else:
|
else:
|
||||||
return self._parse_unary_expression()
|
return self._parse_unary_expression()
|
||||||
|
|
||||||
@ -2768,7 +2769,7 @@ class DefinitionParser(BaseParser):
|
|||||||
msg += " (e.g., 'void (*f(int arg))(double)')"
|
msg += " (e.g., 'void (*f(int arg))(double)')"
|
||||||
prevErrors.append((exNoPtrParen, msg))
|
prevErrors.append((exNoPtrParen, msg))
|
||||||
header = "Error in declarator"
|
header = "Error in declarator"
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from exNoPtrParen
|
||||||
pos = self.pos
|
pos = self.pos
|
||||||
try:
|
try:
|
||||||
return self._parse_declarator_name_suffix(named, paramMode, typed)
|
return self._parse_declarator_name_suffix(named, paramMode, typed)
|
||||||
@ -2776,7 +2777,7 @@ class DefinitionParser(BaseParser):
|
|||||||
self.pos = pos
|
self.pos = pos
|
||||||
prevErrors.append((e, "If declarator-id"))
|
prevErrors.append((e, "If declarator-id"))
|
||||||
header = "Error in declarator or parameters"
|
header = "Error in declarator or parameters"
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from e
|
||||||
|
|
||||||
def _parse_initializer(self, outer: str = None, allowFallback: bool = True
|
def _parse_initializer(self, outer: str = None, allowFallback: bool = True
|
||||||
) -> ASTInitializer:
|
) -> ASTInitializer:
|
||||||
@ -2844,7 +2845,7 @@ class DefinitionParser(BaseParser):
|
|||||||
if True:
|
if True:
|
||||||
header = "Type must be either just a name or a "
|
header = "Type must be either just a name or a "
|
||||||
header += "typedef-like declaration."
|
header += "typedef-like declaration."
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from exTyped
|
||||||
else:
|
else:
|
||||||
# For testing purposes.
|
# For testing purposes.
|
||||||
# do it again to get the proper traceback (how do you
|
# do it again to get the proper traceback (how do you
|
||||||
@ -2995,7 +2996,7 @@ class DefinitionParser(BaseParser):
|
|||||||
errs = []
|
errs = []
|
||||||
errs.append((exExpr, "If expression"))
|
errs.append((exExpr, "If expression"))
|
||||||
errs.append((exType, "If type"))
|
errs.append((exType, "If type"))
|
||||||
raise self._make_multi_error(errs, header)
|
raise self._make_multi_error(errs, header) from exType
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
@ -3133,7 +3134,7 @@ class CObject(ObjectDescription):
|
|||||||
name = _make_phony_error_name()
|
name = _make_phony_error_name()
|
||||||
symbol = parentSymbol.add_name(name)
|
symbol = parentSymbol.add_name(name)
|
||||||
self.env.temp_data['c:last_symbol'] = symbol
|
self.env.temp_data['c:last_symbol'] = symbol
|
||||||
raise ValueError
|
raise ValueError from e
|
||||||
|
|
||||||
try:
|
try:
|
||||||
symbol = parentSymbol.add_declaration(ast, docname=self.env.docname)
|
symbol = parentSymbol.add_declaration(ast, docname=self.env.docname)
|
||||||
|
@ -4883,7 +4883,7 @@ class DefinitionParser(BaseParser):
|
|||||||
raise self._make_multi_error([
|
raise self._make_multi_error([
|
||||||
(eFold, "If fold expression"),
|
(eFold, "If fold expression"),
|
||||||
(eExpr, "If parenthesized expression")
|
(eExpr, "If parenthesized expression")
|
||||||
], "Error in fold expression or parenthesized expression.")
|
], "Error in fold expression or parenthesized expression.") from eExpr
|
||||||
return ASTParenExpr(res)
|
return ASTParenExpr(res)
|
||||||
# now it definitely is a fold expression
|
# now it definitely is a fold expression
|
||||||
if self.skip_string(')'):
|
if self.skip_string(')'):
|
||||||
@ -5067,7 +5067,7 @@ class DefinitionParser(BaseParser):
|
|||||||
errors = []
|
errors = []
|
||||||
errors.append((eType, "If type"))
|
errors.append((eType, "If type"))
|
||||||
errors.append((eExpr, "If expression"))
|
errors.append((eExpr, "If expression"))
|
||||||
raise self._make_multi_error(errors, header)
|
raise self._make_multi_error(errors, header) from eExpr
|
||||||
else: # a primary expression or a type
|
else: # a primary expression or a type
|
||||||
pos = self.pos
|
pos = self.pos
|
||||||
try:
|
try:
|
||||||
@ -5094,7 +5094,7 @@ class DefinitionParser(BaseParser):
|
|||||||
errors = []
|
errors = []
|
||||||
errors.append((eOuter, "If primary expression"))
|
errors.append((eOuter, "If primary expression"))
|
||||||
errors.append((eInner, "If type"))
|
errors.append((eInner, "If type"))
|
||||||
raise self._make_multi_error(errors, header)
|
raise self._make_multi_error(errors, header) from eInner
|
||||||
|
|
||||||
# and now parse postfixes
|
# and now parse postfixes
|
||||||
postFixes = [] # type: List[ASTPostfixOp]
|
postFixes = [] # type: List[ASTPostfixOp]
|
||||||
@ -5254,7 +5254,8 @@ class DefinitionParser(BaseParser):
|
|||||||
errs = []
|
errs = []
|
||||||
errs.append((exCast, "If type cast expression"))
|
errs.append((exCast, "If type cast expression"))
|
||||||
errs.append((exUnary, "If unary expression"))
|
errs.append((exUnary, "If unary expression"))
|
||||||
raise self._make_multi_error(errs, "Error in cast expression.")
|
raise self._make_multi_error(errs,
|
||||||
|
"Error in cast expression.") from exUnary
|
||||||
else:
|
else:
|
||||||
return self._parse_unary_expression()
|
return self._parse_unary_expression()
|
||||||
|
|
||||||
@ -5505,7 +5506,7 @@ class DefinitionParser(BaseParser):
|
|||||||
self.pos = pos
|
self.pos = pos
|
||||||
prevErrors.append((e, "If non-type argument"))
|
prevErrors.append((e, "If non-type argument"))
|
||||||
header = "Error in parsing template argument list."
|
header = "Error in parsing template argument list."
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from e
|
||||||
if parsedEnd:
|
if parsedEnd:
|
||||||
assert not parsedComma
|
assert not parsedComma
|
||||||
break
|
break
|
||||||
@ -5950,7 +5951,7 @@ class DefinitionParser(BaseParser):
|
|||||||
self.pos = pos
|
self.pos = pos
|
||||||
prevErrors.append((exNoPtrParen, "If parenthesis in noptr-declarator"))
|
prevErrors.append((exNoPtrParen, "If parenthesis in noptr-declarator"))
|
||||||
header = "Error in declarator"
|
header = "Error in declarator"
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from exNoPtrParen
|
||||||
if typed: # pointer to member
|
if typed: # pointer to member
|
||||||
pos = self.pos
|
pos = self.pos
|
||||||
try:
|
try:
|
||||||
@ -5989,7 +5990,7 @@ class DefinitionParser(BaseParser):
|
|||||||
self.pos = pos
|
self.pos = pos
|
||||||
prevErrors.append((e, "If declarator-id"))
|
prevErrors.append((e, "If declarator-id"))
|
||||||
header = "Error in declarator or parameters-and-qualifiers"
|
header = "Error in declarator or parameters-and-qualifiers"
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from e
|
||||||
|
|
||||||
def _parse_initializer(self, outer: str = None, allowFallback: bool = True
|
def _parse_initializer(self, outer: str = None, allowFallback: bool = True
|
||||||
) -> ASTInitializer:
|
) -> ASTInitializer:
|
||||||
@ -6097,7 +6098,7 @@ class DefinitionParser(BaseParser):
|
|||||||
header = "Error when parsing function declaration."
|
header = "Error when parsing function declaration."
|
||||||
else:
|
else:
|
||||||
assert False
|
assert False
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from exTyped
|
||||||
else:
|
else:
|
||||||
# For testing purposes.
|
# For testing purposes.
|
||||||
# do it again to get the proper traceback (how do you
|
# do it again to get the proper traceback (how do you
|
||||||
@ -6164,7 +6165,7 @@ class DefinitionParser(BaseParser):
|
|||||||
errs.append((eType, "If default template argument is a type"))
|
errs.append((eType, "If default template argument is a type"))
|
||||||
msg = "Error in non-type template parameter"
|
msg = "Error in non-type template parameter"
|
||||||
msg += " or constrained template parameter."
|
msg += " or constrained template parameter."
|
||||||
raise self._make_multi_error(errs, msg)
|
raise self._make_multi_error(errs, msg) from eType
|
||||||
|
|
||||||
def _parse_type_using(self) -> ASTTypeUsing:
|
def _parse_type_using(self) -> ASTTypeUsing:
|
||||||
name = self._parse_nested_name()
|
name = self._parse_nested_name()
|
||||||
@ -6511,7 +6512,7 @@ class DefinitionParser(BaseParser):
|
|||||||
self.pos = pos
|
self.pos = pos
|
||||||
prevErrors.append((e, "If type alias or template alias"))
|
prevErrors.append((e, "If type alias or template alias"))
|
||||||
header = "Error in type declaration."
|
header = "Error in type declaration."
|
||||||
raise self._make_multi_error(prevErrors, header)
|
raise self._make_multi_error(prevErrors, header) from e
|
||||||
elif objectType == 'concept':
|
elif objectType == 'concept':
|
||||||
declaration = self._parse_concept()
|
declaration = self._parse_concept()
|
||||||
elif objectType == 'member':
|
elif objectType == 'member':
|
||||||
@ -6577,7 +6578,7 @@ class DefinitionParser(BaseParser):
|
|||||||
errs.append((e1, "If shorthand ref"))
|
errs.append((e1, "If shorthand ref"))
|
||||||
errs.append((e2, "If full function ref"))
|
errs.append((e2, "If full function ref"))
|
||||||
msg = "Error in cross-reference."
|
msg = "Error in cross-reference."
|
||||||
raise self._make_multi_error(errs, msg)
|
raise self._make_multi_error(errs, msg) from e2
|
||||||
|
|
||||||
def parse_expression(self) -> Union[ASTExpression, ASTType]:
|
def parse_expression(self) -> Union[ASTExpression, ASTType]:
|
||||||
pos = self.pos
|
pos = self.pos
|
||||||
@ -6598,7 +6599,7 @@ class DefinitionParser(BaseParser):
|
|||||||
errs = []
|
errs = []
|
||||||
errs.append((exExpr, "If expression"))
|
errs.append((exExpr, "If expression"))
|
||||||
errs.append((exType, "If type"))
|
errs.append((exType, "If type"))
|
||||||
raise self._make_multi_error(errs, header)
|
raise self._make_multi_error(errs, header) from exType
|
||||||
|
|
||||||
|
|
||||||
def _make_phony_error_name() -> ASTNestedName:
|
def _make_phony_error_name() -> ASTNestedName:
|
||||||
@ -6791,7 +6792,7 @@ class CPPObject(ObjectDescription):
|
|||||||
name = _make_phony_error_name()
|
name = _make_phony_error_name()
|
||||||
symbol = parentSymbol.add_name(name)
|
symbol = parentSymbol.add_name(name)
|
||||||
self.env.temp_data['cpp:last_symbol'] = symbol
|
self.env.temp_data['cpp:last_symbol'] = symbol
|
||||||
raise ValueError
|
raise ValueError from e
|
||||||
|
|
||||||
try:
|
try:
|
||||||
symbol = parentSymbol.add_declaration(ast, docname=self.env.docname)
|
symbol = parentSymbol.add_declaration(ast, docname=self.env.docname)
|
||||||
|
@ -1061,10 +1061,10 @@ class StandardDomain(Domain):
|
|||||||
try:
|
try:
|
||||||
figure_id = target_node['ids'][0]
|
figure_id = target_node['ids'][0]
|
||||||
return env.toc_fignumbers[docname][figtype][figure_id]
|
return env.toc_fignumbers[docname][figtype][figure_id]
|
||||||
except (KeyError, IndexError):
|
except (KeyError, IndexError) as exc:
|
||||||
# target_node is found, but fignumber is not assigned.
|
# target_node is found, but fignumber is not assigned.
|
||||||
# Maybe it is defined in orphaned document.
|
# Maybe it is defined in orphaned document.
|
||||||
raise ValueError
|
raise ValueError from exc
|
||||||
|
|
||||||
def get_full_qualified_name(self, node: Element) -> str:
|
def get_full_qualified_name(self, node: Element) -> str:
|
||||||
if node.get('reftype') == 'option':
|
if node.get('reftype') == 'option':
|
||||||
|
@ -393,7 +393,8 @@ class BuildEnvironment:
|
|||||||
if catalog.domain == domain:
|
if catalog.domain == domain:
|
||||||
self.dependencies[docname].add(catalog.mo_path)
|
self.dependencies[docname].add(catalog.mo_path)
|
||||||
except OSError as exc:
|
except OSError as exc:
|
||||||
raise DocumentError(__('Failed to scan documents in %s: %r') % (self.srcdir, exc))
|
raise DocumentError(__('Failed to scan documents in %s: %r') %
|
||||||
|
(self.srcdir, exc)) from exc
|
||||||
|
|
||||||
def get_outdated_files(self, config_changed: bool) -> Tuple[Set[str], Set[str], Set[str]]:
|
def get_outdated_files(self, config_changed: bool) -> Tuple[Set[str], Set[str], Set[str]]:
|
||||||
"""Return (added, changed, removed) sets."""
|
"""Return (added, changed, removed) sets."""
|
||||||
@ -511,8 +512,8 @@ class BuildEnvironment:
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return self.domains[domainname]
|
return self.domains[domainname]
|
||||||
except KeyError:
|
except KeyError as exc:
|
||||||
raise ExtensionError(__('Domain %r is not registered') % domainname)
|
raise ExtensionError(__('Domain %r is not registered') % domainname) from exc
|
||||||
|
|
||||||
# --------- RESOLVING REFERENCES AND TOCTREES ------------------------------
|
# --------- RESOLVING REFERENCES AND TOCTREES ------------------------------
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ def import_module(modname: str, warningiserror: bool = False) -> Any:
|
|||||||
except BaseException as exc:
|
except BaseException as exc:
|
||||||
# Importing modules may cause any side effects, including
|
# Importing modules may cause any side effects, including
|
||||||
# SystemExit, so we need to catch all errors.
|
# SystemExit, so we need to catch all errors.
|
||||||
raise ImportError(exc, traceback.format_exc())
|
raise ImportError(exc, traceback.format_exc()) from exc
|
||||||
|
|
||||||
|
|
||||||
def import_object(modname: str, objpath: List[str], objtype: str = '',
|
def import_object(modname: str, objpath: List[str], objtype: str = '',
|
||||||
@ -98,7 +98,7 @@ def import_object(modname: str, objpath: List[str], objtype: str = '',
|
|||||||
errmsg += '; the following exception was raised:\n%s' % traceback.format_exc()
|
errmsg += '; the following exception was raised:\n%s' % traceback.format_exc()
|
||||||
|
|
||||||
logger.debug(errmsg)
|
logger.debug(errmsg)
|
||||||
raise ImportError(errmsg)
|
raise ImportError(errmsg) from exc
|
||||||
|
|
||||||
|
|
||||||
def get_module_members(module: Any) -> List[Tuple[str, Any]]:
|
def get_module_members(module: Any) -> List[Tuple[str, Any]]:
|
||||||
|
@ -654,7 +654,7 @@ def _import_by_name(name: str) -> Tuple[Any, Any, str]:
|
|||||||
else:
|
else:
|
||||||
return sys.modules[modname], None, modname
|
return sys.modules[modname], None, modname
|
||||||
except (ValueError, ImportError, AttributeError, KeyError) as e:
|
except (ValueError, ImportError, AttributeError, KeyError) as e:
|
||||||
raise ImportError(*e.args)
|
raise ImportError(*e.args) from e
|
||||||
|
|
||||||
|
|
||||||
# -- :autolink: (smart default role) -------------------------------------------
|
# -- :autolink: (smart default role) -------------------------------------------
|
||||||
|
@ -256,7 +256,7 @@ def render_dot(self: SphinxTranslator, code: str, options: Dict,
|
|||||||
return None, None
|
return None, None
|
||||||
except CalledProcessError as exc:
|
except CalledProcessError as exc:
|
||||||
raise GraphvizError(__('dot exited with error:\n[stderr]\n%r\n'
|
raise GraphvizError(__('dot exited with error:\n[stderr]\n%r\n'
|
||||||
'[stdout]\n%r') % (exc.stderr, exc.stdout))
|
'[stdout]\n%r') % (exc.stderr, exc.stdout)) from exc
|
||||||
|
|
||||||
|
|
||||||
def render_dot_html(self: HTMLTranslator, node: graphviz, code: str, options: Dict,
|
def render_dot_html(self: HTMLTranslator, node: graphviz, code: str, options: Dict,
|
||||||
@ -270,7 +270,7 @@ def render_dot_html(self: HTMLTranslator, node: graphviz, code: str, options: Di
|
|||||||
fname, outfn = render_dot(self, code, options, format, prefix)
|
fname, outfn = render_dot(self, code, options, format, prefix)
|
||||||
except GraphvizError as exc:
|
except GraphvizError as exc:
|
||||||
logger.warning(__('dot code %r: %s'), code, exc)
|
logger.warning(__('dot code %r: %s'), code, exc)
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode from exc
|
||||||
|
|
||||||
classes = [imgcls, 'graphviz'] + node.get('classes', [])
|
classes = [imgcls, 'graphviz'] + node.get('classes', [])
|
||||||
imgcls = ' '.join(filter(None, classes))
|
imgcls = ' '.join(filter(None, classes))
|
||||||
@ -321,7 +321,7 @@ def render_dot_latex(self: LaTeXTranslator, node: graphviz, code: str,
|
|||||||
fname, outfn = render_dot(self, code, options, 'pdf', prefix)
|
fname, outfn = render_dot(self, code, options, 'pdf', prefix)
|
||||||
except GraphvizError as exc:
|
except GraphvizError as exc:
|
||||||
logger.warning(__('dot code %r: %s'), code, exc)
|
logger.warning(__('dot code %r: %s'), code, exc)
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode from exc
|
||||||
|
|
||||||
is_inline = self.is_inline(node)
|
is_inline = self.is_inline(node)
|
||||||
|
|
||||||
@ -358,7 +358,7 @@ def render_dot_texinfo(self: TexinfoTranslator, node: graphviz, code: str,
|
|||||||
fname, outfn = render_dot(self, code, options, 'png', prefix)
|
fname, outfn = render_dot(self, code, options, 'png', prefix)
|
||||||
except GraphvizError as exc:
|
except GraphvizError as exc:
|
||||||
logger.warning(__('dot code %r: %s'), code, exc)
|
logger.warning(__('dot code %r: %s'), code, exc)
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode from exc
|
||||||
if fname is not None:
|
if fname is not None:
|
||||||
self.body.append('@image{%s,,,[graphviz],png}\n' % fname[:-4])
|
self.body.append('@image{%s,,,[graphviz],png}\n' % fname[:-4])
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode
|
||||||
|
@ -70,7 +70,7 @@ class ImagemagickConverter(ImageConverter):
|
|||||||
except CalledProcessError as exc:
|
except CalledProcessError as exc:
|
||||||
raise ExtensionError(__('convert exited with error:\n'
|
raise ExtensionError(__('convert exited with error:\n'
|
||||||
'[stderr]\n%r\n[stdout]\n%r') %
|
'[stderr]\n%r\n[stdout]\n%r') %
|
||||||
(exc.stderr, exc.stdout))
|
(exc.stderr, exc.stdout)) from exc
|
||||||
|
|
||||||
|
|
||||||
def setup(app: Sphinx) -> Dict[str, Any]:
|
def setup(app: Sphinx) -> Dict[str, Any]:
|
||||||
|
@ -165,13 +165,13 @@ def compile_math(latex: str, builder: Builder) -> str:
|
|||||||
try:
|
try:
|
||||||
subprocess.run(command, stdout=PIPE, stderr=PIPE, cwd=tempdir, check=True)
|
subprocess.run(command, stdout=PIPE, stderr=PIPE, cwd=tempdir, check=True)
|
||||||
return path.join(tempdir, 'math.dvi')
|
return path.join(tempdir, 'math.dvi')
|
||||||
except OSError:
|
except OSError as exc:
|
||||||
logger.warning(__('LaTeX command %r cannot be run (needed for math '
|
logger.warning(__('LaTeX command %r cannot be run (needed for math '
|
||||||
'display), check the imgmath_latex setting'),
|
'display), check the imgmath_latex setting'),
|
||||||
builder.config.imgmath_latex)
|
builder.config.imgmath_latex)
|
||||||
raise InvokeError
|
raise InvokeError from exc
|
||||||
except CalledProcessError as exc:
|
except CalledProcessError as exc:
|
||||||
raise MathExtError('latex exited with error', exc.stderr, exc.stdout)
|
raise MathExtError('latex exited with error', exc.stderr, exc.stdout) from exc
|
||||||
|
|
||||||
|
|
||||||
def convert_dvi_to_image(command: List[str], name: str) -> Tuple[bytes, bytes]:
|
def convert_dvi_to_image(command: List[str], name: str) -> Tuple[bytes, bytes]:
|
||||||
@ -179,13 +179,13 @@ def convert_dvi_to_image(command: List[str], name: str) -> Tuple[bytes, bytes]:
|
|||||||
try:
|
try:
|
||||||
ret = subprocess.run(command, stdout=PIPE, stderr=PIPE, check=True)
|
ret = subprocess.run(command, stdout=PIPE, stderr=PIPE, check=True)
|
||||||
return ret.stdout, ret.stderr
|
return ret.stdout, ret.stderr
|
||||||
except OSError:
|
except OSError as exc:
|
||||||
logger.warning(__('%s command %r cannot be run (needed for math '
|
logger.warning(__('%s command %r cannot be run (needed for math '
|
||||||
'display), check the imgmath_%s setting'),
|
'display), check the imgmath_%s setting'),
|
||||||
name, command[0], name)
|
name, command[0], name)
|
||||||
raise InvokeError
|
raise InvokeError from exc
|
||||||
except CalledProcessError as exc:
|
except CalledProcessError as exc:
|
||||||
raise MathExtError('%s exited with error' % name, exc.stderr, exc.stdout)
|
raise MathExtError('%s exited with error' % name, exc.stderr, exc.stdout) from exc
|
||||||
|
|
||||||
|
|
||||||
def convert_dvi_to_png(dvipath: str, builder: Builder) -> Tuple[str, int]:
|
def convert_dvi_to_png(dvipath: str, builder: Builder) -> Tuple[str, int]:
|
||||||
@ -326,7 +326,7 @@ def html_visit_math(self: HTMLTranslator, node: nodes.math) -> None:
|
|||||||
backrefs=[], source=node.astext())
|
backrefs=[], source=node.astext())
|
||||||
sm.walkabout(self)
|
sm.walkabout(self)
|
||||||
logger.warning(__('display latex %r: %s'), node.astext(), msg)
|
logger.warning(__('display latex %r: %s'), node.astext(), msg)
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode from exc
|
||||||
if fname is None:
|
if fname is None:
|
||||||
# something failed -- use text-only as a bad substitute
|
# something failed -- use text-only as a bad substitute
|
||||||
self.body.append('<span class="math">%s</span>' %
|
self.body.append('<span class="math">%s</span>' %
|
||||||
@ -352,7 +352,7 @@ def html_visit_displaymath(self: HTMLTranslator, node: nodes.math_block) -> None
|
|||||||
backrefs=[], source=node.astext())
|
backrefs=[], source=node.astext())
|
||||||
sm.walkabout(self)
|
sm.walkabout(self)
|
||||||
logger.warning(__('inline latex %r: %s'), node.astext(), msg)
|
logger.warning(__('inline latex %r: %s'), node.astext(), msg)
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode from exc
|
||||||
self.body.append(self.starttag(node, 'div', CLASS='math'))
|
self.body.append(self.starttag(node, 'div', CLASS='math'))
|
||||||
self.body.append('<p>')
|
self.body.append('<p>')
|
||||||
if node['number']:
|
if node['number']:
|
||||||
|
@ -179,7 +179,7 @@ def fetch_inventory(app: Sphinx, uri: str, inv: Any) -> Any:
|
|||||||
join = path.join if localuri else posixpath.join
|
join = path.join if localuri else posixpath.join
|
||||||
invdata = InventoryFile.load(f, uri, join)
|
invdata = InventoryFile.load(f, uri, join)
|
||||||
except ValueError as exc:
|
except ValueError as exc:
|
||||||
raise ValueError('unknown or unsupported inventory version: %r' % exc)
|
raise ValueError('unknown or unsupported inventory version: %r' % exc) from exc
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
err.args = ('intersphinx inventory %r not readable due to %s: %s',
|
err.args = ('intersphinx inventory %r not readable due to %s: %s',
|
||||||
inv, err.__class__.__name__, str(err))
|
inv, err.__class__.__name__, str(err))
|
||||||
|
@ -37,7 +37,7 @@ class ModuleAnalyzer:
|
|||||||
try:
|
try:
|
||||||
mod = import_module(modname)
|
mod = import_module(modname)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise PycodeError('error importing %r' % modname, err)
|
raise PycodeError('error importing %r' % modname, err) from err
|
||||||
loader = getattr(mod, '__loader__', None)
|
loader = getattr(mod, '__loader__', None)
|
||||||
filename = getattr(mod, '__file__', None)
|
filename = getattr(mod, '__file__', None)
|
||||||
if loader and getattr(loader, 'get_source', None):
|
if loader and getattr(loader, 'get_source', None):
|
||||||
@ -54,7 +54,7 @@ class ModuleAnalyzer:
|
|||||||
try:
|
try:
|
||||||
filename = loader.get_filename(modname)
|
filename = loader.get_filename(modname)
|
||||||
except ImportError as err:
|
except ImportError as err:
|
||||||
raise PycodeError('error getting filename for %r' % modname, err)
|
raise PycodeError('error getting filename for %r' % modname, err) from err
|
||||||
if filename is None:
|
if filename is None:
|
||||||
# all methods for getting filename failed, so raise...
|
# all methods for getting filename failed, so raise...
|
||||||
raise PycodeError('no source found for module %r' % modname)
|
raise PycodeError('no source found for module %r' % modname)
|
||||||
@ -92,7 +92,7 @@ class ModuleAnalyzer:
|
|||||||
if '.egg' + path.sep in filename:
|
if '.egg' + path.sep in filename:
|
||||||
obj = cls.cache['file', filename] = cls.for_egg(filename, modname)
|
obj = cls.cache['file', filename] = cls.for_egg(filename, modname)
|
||||||
else:
|
else:
|
||||||
raise PycodeError('error opening %r' % filename, err)
|
raise PycodeError('error opening %r' % filename, err) from err
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -104,7 +104,7 @@ class ModuleAnalyzer:
|
|||||||
code = egg.read(relpath).decode()
|
code = egg.read(relpath).decode()
|
||||||
return cls.for_string(code, modname, filename)
|
return cls.for_string(code, modname, filename)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise PycodeError('error opening %r' % filename, exc)
|
raise PycodeError('error opening %r' % filename, exc) from exc
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def for_module(cls, modname: str) -> "ModuleAnalyzer":
|
def for_module(cls, modname: str) -> "ModuleAnalyzer":
|
||||||
@ -169,7 +169,7 @@ class ModuleAnalyzer:
|
|||||||
self.tags = parser.definitions
|
self.tags = parser.definitions
|
||||||
self.tagorder = parser.deforders
|
self.tagorder = parser.deforders
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise PycodeError('parsing %r failed: %r' % (self.srcname, exc))
|
raise PycodeError('parsing %r failed: %r' % (self.srcname, exc)) from exc
|
||||||
|
|
||||||
def find_attr_docs(self) -> Dict[Tuple[str, str], List[str]]:
|
def find_attr_docs(self) -> Dict[Tuple[str, str], List[str]]:
|
||||||
"""Find class and module-level attributes and their documentation."""
|
"""Find class and module-level attributes and their documentation."""
|
||||||
|
@ -139,9 +139,9 @@ class SphinxComponentRegistry:
|
|||||||
entry_points = iter_entry_points('sphinx.builders', name)
|
entry_points = iter_entry_points('sphinx.builders', name)
|
||||||
try:
|
try:
|
||||||
entry_point = next(entry_points)
|
entry_point = next(entry_points)
|
||||||
except StopIteration:
|
except StopIteration as exc:
|
||||||
raise SphinxError(__('Builder name %s not registered or available'
|
raise SphinxError(__('Builder name %s not registered or available'
|
||||||
' through entry point') % name)
|
' through entry point') % name) from exc
|
||||||
|
|
||||||
self.load_extension(app, entry_point.module_name)
|
self.load_extension(app, entry_point.module_name)
|
||||||
|
|
||||||
@ -273,8 +273,8 @@ class SphinxComponentRegistry:
|
|||||||
def get_source_parser(self, filetype: str) -> "Type[Parser]":
|
def get_source_parser(self, filetype: str) -> "Type[Parser]":
|
||||||
try:
|
try:
|
||||||
return self.source_parsers[filetype]
|
return self.source_parsers[filetype]
|
||||||
except KeyError:
|
except KeyError as exc:
|
||||||
raise SphinxError(__('Source parser for %s not registered') % filetype)
|
raise SphinxError(__('Source parser for %s not registered') % filetype) from exc
|
||||||
|
|
||||||
def get_source_parsers(self) -> Dict[str, "Type[Parser]"]:
|
def get_source_parsers(self) -> Dict[str, "Type[Parser]"]:
|
||||||
return self.source_parsers
|
return self.source_parsers
|
||||||
@ -311,9 +311,11 @@ class SphinxComponentRegistry:
|
|||||||
try:
|
try:
|
||||||
visit, depart = handlers # unpack once for assertion
|
visit, depart = handlers # unpack once for assertion
|
||||||
translation_handlers[node.__name__] = (visit, depart)
|
translation_handlers[node.__name__] = (visit, depart)
|
||||||
except ValueError:
|
except ValueError as exc:
|
||||||
raise ExtensionError(__('kwargs for add_node() must be a (visit, depart) '
|
raise ExtensionError(
|
||||||
'function tuple: %r=%r') % (builder_name, handlers))
|
__('kwargs for add_node() must be a (visit, depart) '
|
||||||
|
'function tuple: %r=%r') % (builder_name, handlers)
|
||||||
|
) from exc
|
||||||
|
|
||||||
def get_translator_class(self, builder: Builder) -> "Type[nodes.NodeVisitor]":
|
def get_translator_class(self, builder: Builder) -> "Type[nodes.NodeVisitor]":
|
||||||
return self.translators.get(builder.name,
|
return self.translators.get(builder.name,
|
||||||
@ -407,7 +409,8 @@ class SphinxComponentRegistry:
|
|||||||
mod = import_module(extname)
|
mod = import_module(extname)
|
||||||
except ImportError as err:
|
except ImportError as err:
|
||||||
logger.verbose(__('Original exception:\n') + traceback.format_exc())
|
logger.verbose(__('Original exception:\n') + traceback.format_exc())
|
||||||
raise ExtensionError(__('Could not import extension %s') % extname, err)
|
raise ExtensionError(__('Could not import extension %s') % extname,
|
||||||
|
err) from err
|
||||||
|
|
||||||
setup = getattr(mod, 'setup', None)
|
setup = getattr(mod, 'setup', None)
|
||||||
if setup is None:
|
if setup is None:
|
||||||
@ -423,7 +426,7 @@ class SphinxComponentRegistry:
|
|||||||
__('The %s extension used by this project needs at least '
|
__('The %s extension used by this project needs at least '
|
||||||
'Sphinx v%s; it therefore cannot be built with this '
|
'Sphinx v%s; it therefore cannot be built with this '
|
||||||
'version.') % (extname, err)
|
'version.') % (extname, err)
|
||||||
)
|
) from err
|
||||||
|
|
||||||
if metadata is None:
|
if metadata is None:
|
||||||
metadata = {}
|
metadata = {}
|
||||||
|
@ -528,9 +528,9 @@ class SearchJapanese(SearchLanguage):
|
|||||||
dotted_path = options.get('type', 'sphinx.search.ja.DefaultSplitter')
|
dotted_path = options.get('type', 'sphinx.search.ja.DefaultSplitter')
|
||||||
try:
|
try:
|
||||||
self.splitter = import_object(dotted_path)(options)
|
self.splitter = import_object(dotted_path)(options)
|
||||||
except ExtensionError:
|
except ExtensionError as exc:
|
||||||
raise ExtensionError("Splitter module %r can't be imported" %
|
raise ExtensionError("Splitter module %r can't be imported" %
|
||||||
dotted_path)
|
dotted_path) from exc
|
||||||
|
|
||||||
def split(self, input: str) -> List[str]:
|
def split(self, input: str) -> List[str]:
|
||||||
return self.splitter.split(input)
|
return self.splitter.split(input)
|
||||||
|
@ -198,7 +198,7 @@ class BuildDoc(Command):
|
|||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
handle_exception(app, self, exc, sys.stderr)
|
handle_exception(app, self, exc, sys.stderr)
|
||||||
if not self.pdb:
|
if not self.pdb:
|
||||||
raise SystemExit(1)
|
raise SystemExit(1) from exc
|
||||||
|
|
||||||
if not self.link_index:
|
if not self.link_index:
|
||||||
continue
|
continue
|
||||||
|
@ -74,17 +74,17 @@ class Theme:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
inherit = self.config.get('theme', 'inherit')
|
inherit = self.config.get('theme', 'inherit')
|
||||||
except configparser.NoSectionError:
|
except configparser.NoSectionError as exc:
|
||||||
raise ThemeError(__('theme %r doesn\'t have "theme" setting') % name)
|
raise ThemeError(__('theme %r doesn\'t have "theme" setting') % name) from exc
|
||||||
except configparser.NoOptionError:
|
except configparser.NoOptionError as exc:
|
||||||
raise ThemeError(__('theme %r doesn\'t have "inherit" setting') % name)
|
raise ThemeError(__('theme %r doesn\'t have "inherit" setting') % name) from exc
|
||||||
|
|
||||||
if inherit != 'none':
|
if inherit != 'none':
|
||||||
try:
|
try:
|
||||||
self.base = factory.create(inherit)
|
self.base = factory.create(inherit)
|
||||||
except ThemeError:
|
except ThemeError as exc:
|
||||||
raise ThemeError(__('no theme named %r found, inherited by %r') %
|
raise ThemeError(__('no theme named %r found, inherited by %r') %
|
||||||
(inherit, name))
|
(inherit, name)) from exc
|
||||||
|
|
||||||
def get_theme_dirs(self) -> List[str]:
|
def get_theme_dirs(self) -> List[str]:
|
||||||
"""Return a list of theme directories, beginning with this theme's,
|
"""Return a list of theme directories, beginning with this theme's,
|
||||||
@ -101,13 +101,13 @@ class Theme:
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return self.config.get(section, name)
|
return self.config.get(section, name)
|
||||||
except (configparser.NoOptionError, configparser.NoSectionError):
|
except (configparser.NoOptionError, configparser.NoSectionError) as exc:
|
||||||
if self.base:
|
if self.base:
|
||||||
return self.base.get_config(section, name, default)
|
return self.base.get_config(section, name, default)
|
||||||
|
|
||||||
if default is NODEFAULT:
|
if default is NODEFAULT:
|
||||||
raise ThemeError(__('setting %s.%s occurs in none of the '
|
raise ThemeError(__('setting %s.%s occurs in none of the '
|
||||||
'searched theme configs') % (section, name))
|
'searched theme configs') % (section, name)) from exc
|
||||||
else:
|
else:
|
||||||
return default
|
return default
|
||||||
|
|
||||||
|
@ -82,8 +82,8 @@ class ReferencesResolver(SphinxPostTransform):
|
|||||||
# let the domain try to resolve the reference
|
# let the domain try to resolve the reference
|
||||||
try:
|
try:
|
||||||
domain = self.env.domains[node['refdomain']]
|
domain = self.env.domains[node['refdomain']]
|
||||||
except KeyError:
|
except KeyError as exc:
|
||||||
raise NoUri(target, typ)
|
raise NoUri(target, typ) from exc
|
||||||
newnode = domain.resolve_xref(self.env, refdoc, self.app.builder,
|
newnode = domain.resolve_xref(self.env, refdoc, self.app.builder,
|
||||||
typ, target, node, contnode)
|
typ, target, node, contnode)
|
||||||
# really hardwired reference types
|
# really hardwired reference types
|
||||||
|
@ -285,21 +285,21 @@ def get_module_source(modname: str) -> Tuple[str, str]:
|
|||||||
try:
|
try:
|
||||||
mod = import_module(modname)
|
mod = import_module(modname)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise PycodeError('error importing %r' % modname, err)
|
raise PycodeError('error importing %r' % modname, err) from err
|
||||||
filename = getattr(mod, '__file__', None)
|
filename = getattr(mod, '__file__', None)
|
||||||
loader = getattr(mod, '__loader__', None)
|
loader = getattr(mod, '__loader__', None)
|
||||||
if loader and getattr(loader, 'get_filename', None):
|
if loader and getattr(loader, 'get_filename', None):
|
||||||
try:
|
try:
|
||||||
filename = loader.get_filename(modname)
|
filename = loader.get_filename(modname)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise PycodeError('error getting filename for %r' % filename, err)
|
raise PycodeError('error getting filename for %r' % filename, err) from err
|
||||||
if filename is None and loader:
|
if filename is None and loader:
|
||||||
try:
|
try:
|
||||||
filename = loader.get_source(modname)
|
filename = loader.get_source(modname)
|
||||||
if filename:
|
if filename:
|
||||||
return 'string', filename
|
return 'string', filename
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
raise PycodeError('error getting source for %r' % modname, err)
|
raise PycodeError('error getting source for %r' % modname, err) from err
|
||||||
if filename is None:
|
if filename is None:
|
||||||
raise PycodeError('no source found for module %r' % modname)
|
raise PycodeError('no source found for module %r' % modname)
|
||||||
filename = path.normpath(path.abspath(filename))
|
filename = path.normpath(path.abspath(filename))
|
||||||
@ -456,8 +456,8 @@ def parselinenos(spec: str, total: int) -> List[int]:
|
|||||||
items.extend(range(start - 1, end))
|
items.extend(range(start - 1, end))
|
||||||
else:
|
else:
|
||||||
raise ValueError
|
raise ValueError
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
raise ValueError('invalid line number spec: %r' % spec)
|
raise ValueError('invalid line number spec: %r' % spec) from exc
|
||||||
|
|
||||||
return items
|
return items
|
||||||
|
|
||||||
@ -596,9 +596,9 @@ def import_object(objname: str, source: str = None) -> Any:
|
|||||||
except (AttributeError, ImportError) as exc:
|
except (AttributeError, ImportError) as exc:
|
||||||
if source:
|
if source:
|
||||||
raise ExtensionError('Could not import %s (needed for %s)' %
|
raise ExtensionError('Could not import %s (needed for %s)' %
|
||||||
(objname, source), exc)
|
(objname, source), exc) from exc
|
||||||
else:
|
else:
|
||||||
raise ExtensionError('Could not import %s' % objname, exc)
|
raise ExtensionError('Could not import %s' % objname, exc) from exc
|
||||||
|
|
||||||
|
|
||||||
def split_full_qualified_name(name: str) -> Tuple[str, str]:
|
def split_full_qualified_name(name: str) -> Tuple[str, str]:
|
||||||
|
@ -312,7 +312,7 @@ def get_image_filename_for_language(filename: str, env: "BuildEnvironment") -> s
|
|||||||
try:
|
try:
|
||||||
return filename_format.format(**d)
|
return filename_format.format(**d)
|
||||||
except KeyError as exc:
|
except KeyError as exc:
|
||||||
raise SphinxError('Invalid figure_language_filename: %r' % exc)
|
raise SphinxError('Invalid figure_language_filename: %r' % exc) from exc
|
||||||
|
|
||||||
|
|
||||||
def search_image_for_language(filename: str, env: "BuildEnvironment") -> str:
|
def search_image_for_language(filename: str, env: "BuildEnvironment") -> str:
|
||||||
|
@ -322,7 +322,7 @@ def safe_getattr(obj: Any, name: str, *defargs: Any) -> Any:
|
|||||||
"""A getattr() that turns all exceptions into AttributeErrors."""
|
"""A getattr() that turns all exceptions into AttributeErrors."""
|
||||||
try:
|
try:
|
||||||
return getattr(obj, name, *defargs)
|
return getattr(obj, name, *defargs)
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
# sometimes accessing a property raises an exception (e.g.
|
# sometimes accessing a property raises an exception (e.g.
|
||||||
# NotImplementedError), so let's try to read the attribute directly
|
# NotImplementedError), so let's try to read the attribute directly
|
||||||
try:
|
try:
|
||||||
@ -337,7 +337,7 @@ def safe_getattr(obj: Any, name: str, *defargs: Any) -> Any:
|
|||||||
if defargs:
|
if defargs:
|
||||||
return defargs[0]
|
return defargs[0]
|
||||||
|
|
||||||
raise AttributeError(name)
|
raise AttributeError(name) from exc
|
||||||
|
|
||||||
|
|
||||||
def safe_getmembers(object: Any, predicate: Callable[[str], bool] = None,
|
def safe_getmembers(object: Any, predicate: Callable[[str], bool] = None,
|
||||||
@ -386,8 +386,8 @@ def object_description(object: Any) -> str:
|
|||||||
for x in sorted_values)
|
for x in sorted_values)
|
||||||
try:
|
try:
|
||||||
s = repr(object)
|
s = repr(object)
|
||||||
except Exception:
|
except Exception as exc:
|
||||||
raise ValueError
|
raise ValueError from exc
|
||||||
# Strip non-deterministic memory addresses such as
|
# Strip non-deterministic memory addresses such as
|
||||||
# ``<__main__.A at 0x7f68cb685710>``
|
# ``<__main__.A at 0x7f68cb685710>``
|
||||||
s = memory_address_re.sub('', s)
|
s = memory_address_re.sub('', s)
|
||||||
|
@ -168,10 +168,10 @@ def abspath(pathdir: str) -> str:
|
|||||||
if isinstance(pathdir, bytes):
|
if isinstance(pathdir, bytes):
|
||||||
try:
|
try:
|
||||||
pathdir = pathdir.decode(fs_encoding)
|
pathdir = pathdir.decode(fs_encoding)
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError as exc:
|
||||||
raise UnicodeDecodeError('multibyte filename not supported on '
|
raise UnicodeDecodeError('multibyte filename not supported on '
|
||||||
'this filesystem encoding '
|
'this filesystem encoding '
|
||||||
'(%r)' % fs_encoding)
|
'(%r)' % fs_encoding) from exc
|
||||||
return pathdir
|
return pathdir
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,11 +34,11 @@ def convert_with_2to3(filepath: str) -> str:
|
|||||||
try:
|
try:
|
||||||
from lib2to3.refactor import RefactoringTool, get_fixers_from_package
|
from lib2to3.refactor import RefactoringTool, get_fixers_from_package
|
||||||
from lib2to3.pgen2.parse import ParseError
|
from lib2to3.pgen2.parse import ParseError
|
||||||
except ImportError:
|
except ImportError as exc:
|
||||||
# python 3.9.0a6+ emits PendingDeprecationWarning for lib2to3.
|
# python 3.9.0a6+ emits PendingDeprecationWarning for lib2to3.
|
||||||
# Additionally, removal of the module is still discussed at PEP-594.
|
# Additionally, removal of the module is still discussed at PEP-594.
|
||||||
# To support future python, this catches ImportError for lib2to3.
|
# To support future python, this catches ImportError for lib2to3.
|
||||||
raise SyntaxError
|
raise SyntaxError from exc
|
||||||
|
|
||||||
fixers = get_fixers_from_package('lib2to3.fixes')
|
fixers = get_fixers_from_package('lib2to3.fixes')
|
||||||
refactoring_tool = RefactoringTool(fixers)
|
refactoring_tool = RefactoringTool(fixers)
|
||||||
@ -49,7 +49,8 @@ def convert_with_2to3(filepath: str) -> str:
|
|||||||
# do not propagate lib2to3 exceptions
|
# do not propagate lib2to3 exceptions
|
||||||
lineno, offset = err.context[1]
|
lineno, offset = err.context[1]
|
||||||
# try to match ParseError details with SyntaxError details
|
# try to match ParseError details with SyntaxError details
|
||||||
raise SyntaxError(err.msg, (filepath, lineno, offset, err.value))
|
|
||||||
|
raise SyntaxError(err.msg, (filepath, lineno, offset, err.value)) from err
|
||||||
return str(tree)
|
return str(tree)
|
||||||
|
|
||||||
|
|
||||||
|
@ -853,8 +853,8 @@ class TexinfoTranslator(SphinxTranslator):
|
|||||||
num = node.astext().strip()
|
num = node.astext().strip()
|
||||||
try:
|
try:
|
||||||
footnode, used = self.footnotestack[-1][num]
|
footnode, used = self.footnotestack[-1][num]
|
||||||
except (KeyError, IndexError):
|
except (KeyError, IndexError) as exc:
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode from exc
|
||||||
# footnotes are repeated for each reference
|
# footnotes are repeated for each reference
|
||||||
footnode.walkabout(self) # type: ignore
|
footnode.walkabout(self) # type: ignore
|
||||||
raise nodes.SkipChildren
|
raise nodes.SkipChildren
|
||||||
|
@ -64,8 +64,8 @@ def compile_latex_document(app, filename='python.tex'):
|
|||||||
'-output-directory=%s' % app.config.latex_engine,
|
'-output-directory=%s' % app.config.latex_engine,
|
||||||
filename]
|
filename]
|
||||||
subprocess.run(args, stdout=PIPE, stderr=PIPE, check=True)
|
subprocess.run(args, stdout=PIPE, stderr=PIPE, check=True)
|
||||||
except OSError: # most likely the latex executable was not found
|
except OSError as exc: # most likely the latex executable was not found
|
||||||
raise pytest.skip.Exception
|
raise pytest.skip.Exception from exc
|
||||||
except CalledProcessError as exc:
|
except CalledProcessError as exc:
|
||||||
print(exc.stdout)
|
print(exc.stdout)
|
||||||
print(exc.stderr)
|
print(exc.stderr)
|
||||||
|
@ -58,8 +58,8 @@ def test_texinfo(app, status, warning):
|
|||||||
try:
|
try:
|
||||||
args = ['makeinfo', '--no-split', 'sphinxtests.texi']
|
args = ['makeinfo', '--no-split', 'sphinxtests.texi']
|
||||||
subprocess.run(args, stdout=PIPE, stderr=PIPE, cwd=app.outdir, check=True)
|
subprocess.run(args, stdout=PIPE, stderr=PIPE, cwd=app.outdir, check=True)
|
||||||
except OSError:
|
except OSError as exc:
|
||||||
raise pytest.skip.Exception # most likely makeinfo was not found
|
raise pytest.skip.Exception from exc # most likely makeinfo was not found
|
||||||
except CalledProcessError as exc:
|
except CalledProcessError as exc:
|
||||||
print(exc.stdout)
|
print(exc.stdout)
|
||||||
print(exc.stderr)
|
print(exc.stderr)
|
||||||
|
Loading…
Reference in New Issue
Block a user