问题
I've created new exception class and I like to give it representation of errors like in OSError class. Here is what I want:
>>> raise(MyError(1, 'info'))
MyError: [Errno 1] predefined text: info
What should I do? Can I do this if I inherit from base Exception class? Here is what I've tried (example from module for work with gnulib):
class GNULibError(Exception):
'''Exception handler for GNULib classes.'''
def __init__(self, errno, errinfo=None):
'''Each error has following parameters:
errno: code of error; used to catch error type
1: destination directory does not exist: <destdir>
2: configure file does not exist: <configure.ac>
3: selected module does not exist: <module>
4: <cache> is expected to contain gl_M4_BASE([m4base])
5: missing sourcebase argument
6: missing docbase argument
7: missing testsbase argument
8: missing libname argument
errinfo: additional info'''
self.errno = errno; self.errinfo = errinfo
self.args = (self.errno, self.errinfo)
def __str__(self):
errors = \
[ # Begin list of errors
"destination directory does not exist: %s" % self.errinfo,
"configure file does not exist: %s" % self.errinfo,
"selected module does not exist: %s" % self.errinfo,
"%s is expected to contain gl_M4_BASE([%s])" % \
(os.path.join(self.errinfo, 'gnulib-comp.m4'), self.errinfo),
"missing sourcebase argument; cache file doesn't contain it,"
+" so you might have to set this argument",
"missing docbase argument; you might have to create GNULibImport" \
+" instance with mode 0 and docbase argument",
"missing testsbase argument; cache file doesn't contain it,"
+" so you might have to set this argument"
"missing libname argument; cache file doesn't contain it,"
+" so you might have to set this argument",
"dependencies and testflag 'default' cannot be used together",
] # Complete list of errors
if not PYTHON3:
self.message = (b'[Errno %d] %s' % \
(self.errno, errors[self.errno -1].encode(ENCS['default'])))
else: # if PYTHON3
self.message = ('[Errno %d] %s' % \
(self.errno, errors[self.errno -1]))
return(self.message)
It works wrong and returns just error name for Python 2 and empty string for Python 3. How can I get such behaviour as I want? Thanks!
回答1:
You should implement __repr__ method instead of __str__
http://docs.python.org/reference/datamodel.html#object.__repr__
That will work:
class GNULibError(Exception):
'''Exception handler for GNULib classes.'''
def __init__(self, errno, errinfo=None):
'''Each error has following parameters:
errno: code of error; used to catch error type
1: destination directory does not exist: <destdir>
2: configure file does not exist: <configure.ac>
3: selected module does not exist: <module>
4: <cache> is expected to contain gl_M4_BASE([m4base])
5: missing sourcebase argument
6: missing docbase argument
7: missing testsbase argument
8: missing libname argument
errinfo: additional info'''
self.errno = errno; self.errinfo = errinfo
self.args = (self.errno, self.errinfo)
def __repr__(self):
errors = \
[ # Begin list of errors
"destination directory does not exist: %s" % self.errinfo,
"configure file does not exist: %s" % self.errinfo,
"selected module does not exist: %s" % self.errinfo,
"%s is expected to contain gl_M4_BASE([%s])" % \
(os.path.join(self.errinfo, 'gnulib-comp.m4'), self.errinfo),
"missing sourcebase argument; cache file doesn't contain it,"
+" so you might have to set this argument",
"missing docbase argument; you might have to create GNULibImport" \
+" instance with mode 0 and docbase argument",
"missing testsbase argument; cache file doesn't contain it,"
+" so you might have to set this argument"
"missing libname argument; cache file doesn't contain it,"
+" so you might have to set this argument",
"dependencies and testflag 'default' cannot be used together",
] # Complete list of errors
if not PYTHON3:
self.message = (b'[Errno %d] %s' % \
(self.errno, errors[self.errno -1].encode(ENCS['default'])))
else: # if PYTHON3
self.message = ('[Errno %d] %s' % \
(self.errno, errors[self.errno -1]))
return(self.message)
来源:https://stackoverflow.com/questions/11173945/python-exception-in-the-separated-module-works-wrong