~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

- start introducing hct error classes

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
 
__copyright__ = "Copyright (C) 2005 Canonical Ltd."
19
 
__author__ = "Martin Pool <mbp@canonical.com>"
20
 
 
21
18
# TODO: Change to a standard exception pattern: 
22
19
#
23
20
# - docstring of exceptions is a template for formatting the exception
30
27
# scott@canonical.com--2005/hct--devel--0.10 util/errors.py
31
28
 
32
29
 
33
 
######################################################################
34
 
# exceptions 
 
30
"""Exceptions for bzr, and reporting of them.
 
31
 
 
32
Exceptions are caught at a high level to report errors to the user, and
 
33
might also be caught inside the program.  Therefore it needs to be
 
34
possible to convert them to a meaningful string, and also for them to be
 
35
interrogated by the program.
 
36
 
 
37
Exceptions are defined such that the arguments given to the constructor
 
38
are stored in the object as properties of the same name.  When the
 
39
object is printed as a string, the doc string of the class is used as
 
40
a format string with the property dictionary available to it.
 
41
 
 
42
This means that exceptions can used like this:
 
43
 
 
44
>>> import sys
 
45
>>> try:
 
46
...   raise NotBranchError(path='/foo/bar')
 
47
... except:
 
48
...   print sys.exc_type
 
49
...   print sys.exc_value
 
50
...   print sys.exc_value.path
 
51
bzrlib.errors.NotBranchError
 
52
Not a branch: /foo/bar
 
53
/foo/bar
 
54
 
 
55
Therefore:
 
56
 
 
57
 * create a new exception class for any class of error that can be
 
58
   usefully distinguished.
 
59
 
 
60
 * the printable form of an exception is generated by the base class
 
61
   __str__ method
 
62
"""
 
63
 
 
64
# based on Scott James Remnant's hct error classes
 
65
 
 
66
 
35
67
class BzrError(StandardError):
36
68
    def __str__(self):
37
69
        # XXX: Should we show the exception class in 
51
83
            return n + `self.args`
52
84
 
53
85
 
 
86
class BzrNewError(Exception):
 
87
    """bzr error"""
 
88
    # base classes should override the docstring with their human-
 
89
    # readable explanation
 
90
 
 
91
    def __init__(self, **kwds):
 
92
        for key, value in kwds.items():
 
93
            setattr(self, key, value)
 
94
 
 
95
    def __str__(self):
 
96
        try:
 
97
            return self.__doc__ % self.__dict__
 
98
        except (NameError, ValueError, KeyError), e:
 
99
            return 'Unprintable exception %s: %s' \
 
100
                % (self.__class__.__name__, str(e))
 
101
 
 
102
 
54
103
class BzrCheckError(BzrError):
55
104
    pass
56
105
 
72
121
 
73
122
class NotBranchError(BzrError):
74
123
    """Specified path is not in a branch"""
 
124
    def __init__(self, path):
 
125
        BzrError.__init__(self, path)
 
126
 
75
127
    def __str__(self):
76
128
        return 'not a branch: %s' % self.args[0]
77
129
 
 
130
## class NotBranchError(BzrNewError):
 
131
##     """Not a branch: %(path)s"""
 
132
##     def __init__(self, path):
 
133
##         BzrNewError.__init__(self)
 
134
##         self.path = path
 
135
## 
78
136
 
79
137
class UnsupportedFormatError(BzrError):
80
138
    """Specified path is a bzr branch that we cannot read."""