[PATCH V2] error: make HintException a mix-in class not derived from BaseException (API)
Augie Fackler
raf at durin42.com
Sun Jul 10 14:35:59 EDT 2016
On Sat, Jul 09, 2016 at 03:20:36PM +0900, Yuya Nishihara wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya at tcha.org>
> # Date 1468042110 -32400
> # Sat Jul 09 14:28:30 2016 +0900
> # Node ID bf279db10eb66c70322b062ef1818ddfb06e6daa
> # Parent b4d117cee636be8a566f56e84d4b351a736a1299
> error: make HintException a mix-in class not derived from BaseException (API)
>
> HintException is unrelated to the hierarchy of errors. It is an implementation
> detail whether a class inherits from HintException or not, a sort of "private
> inheritance" in C++.
>
> New Hint isn't an exception class, which prevents catching error by its type:
>
> try:
> dosomething()
> except error.Hint:
> pass
>
> Unfortunately, this passes on PyPy 5.3.1, but not on Python 2, and raises more
> detailed TypeError on Python 3.
>
> diff --git a/mercurial/error.py b/mercurial/error.py
> --- a/mercurial/error.py
> +++ b/mercurial/error.py
> @@ -15,12 +15,17 @@ from __future__ import absolute_import
>
> # Do not import anything here, please
>
> -class HintException(Exception):
> +class Hint(object):
> + """Mix-in to provide a hint of an error
> +
> + This should come first in the inheritance list to consume **kw and pass
> + only *args to the exception class.
> + """
> def __init__(self, *args, **kw):
> - Exception.__init__(self, *args)
> + super(Hint, self).__init__(*args)
> self.hint = kw.get('hint')
should we do kw.pop('hint', None) and then forward **kw?
>
> -class RevlogError(HintException):
> +class RevlogError(Hint, Exception):
> pass
>
> class FilteredIndexError(IndexError):
> @@ -50,10 +55,10 @@ class ManifestLookupError(LookupError):
> class CommandError(Exception):
> """Exception raised on errors in parsing the command line."""
>
> -class InterventionRequired(HintException):
> +class InterventionRequired(Hint, Exception):
> """Exception raised when a command requires human intervention."""
>
> -class Abort(HintException):
> +class Abort(Hint, Exception):
> """Raised if a command needs to print an error and exit."""
>
> class HookLoadError(Abort):
> @@ -87,10 +92,10 @@ class ResponseExpected(Abort):
> from .i18n import _
> Abort.__init__(self, _('response expected'))
>
> -class OutOfBandError(HintException):
> +class OutOfBandError(Hint, Exception):
> """Exception raised when a remote repo reports failure"""
>
> -class ParseError(HintException):
> +class ParseError(Hint, Exception):
> """Raised when parsing config files and {rev,file}sets (msg[, pos])"""
>
> class UnknownIdentifier(ParseError):
> @@ -102,7 +107,7 @@ class UnknownIdentifier(ParseError):
> self.function = function
> self.symbols = symbols
>
> -class RepoError(HintException):
> +class RepoError(Hint, Exception):
> pass
>
> class RepoLookupError(RepoError):
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list