Mercurial > hg
changeset 29509:945b4c14c570
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.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 09 Jul 2016 14:28:30 +0900 |
parents | d65ec41b6384 |
children | 19205a0e2bf1 |
files | mercurial/error.py |
diffstat | 1 files changed, 13 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/error.py Wed Jul 06 22:53:22 2016 -0700 +++ b/mercurial/error.py Sat Jul 09 14:28:30 2016 +0900 @@ -15,12 +15,17 @@ # 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') -class RevlogError(HintException): +class RevlogError(Hint, Exception): pass class FilteredIndexError(IndexError): @@ -50,10 +55,10 @@ 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 @@ 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 @@ self.function = function self.symbols = symbols -class RepoError(HintException): +class RepoError(Hint, Exception): pass class RepoLookupError(RepoError):