~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-06-20 03:50:35 UTC
  • mfrom: (1740.5.9 bzr.mbp.traceback)
  • Revision ID: pqm@pqm.ubuntu.com-20060620035035-a9a7dc096fed5060
(mbp) show traceback on stderr on unexpected errors

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Exceptions for bzr, and reporting of them.
18
18
 
 
19
There are 3 different classes of error:
 
20
 
 
21
 * KeyboardInterrupt, and OSError with EPIPE - the program terminates 
 
22
   with an appropriate short message
 
23
 
 
24
 * User errors, indicating a problem caused by the user such as a bad URL.
 
25
   These are printed in a short form.
 
26
 
 
27
 * Internal unexpected errors, including most Python builtin errors
 
28
   and some raised from inside bzr.  These are printed with a full 
 
29
   traceback and an invitation to report the bug.
 
30
 
19
31
Exceptions are caught at a high level to report errors to the user, and
20
32
might also be caught inside the program.  Therefore it needs to be
21
33
possible to convert them to a meaningful string, and also for them to be
44
56
Therefore:
45
57
 
46
58
 * create a new exception class for any class of error that can be
47
 
   usefully distinguished.
48
 
 
49
 
 * the printable form of an exception is generated by the base class
50
 
   __str__ method
51
 
 
52
 
Exception strings should start with a capital letter and not have a final
53
 
fullstop.
 
59
   usefully distinguished.  If no callers are likely to want to catch
 
60
   one but not another, don't worry about them.
 
61
 
 
62
 * the __str__ method should generate something useful; BzrError provides
 
63
   a good default implementation
 
64
 
 
65
Exception strings should start with a capital letter and should not have a
 
66
final fullstop.
54
67
"""
55
68
 
56
69
from warnings import warn
81
94
 
82
95
 
83
96
class BzrError(StandardError):
 
97
    
 
98
    is_user_error = True
 
99
    
84
100
    def __str__(self):
85
101
        # XXX: Should we show the exception class in 
86
102
        # exceptions that don't provide their own message?  
119
135
class BzrCheckError(BzrNewError):
120
136
    """Internal check failed: %(message)s"""
121
137
 
 
138
    is_user_error = False
 
139
 
122
140
    def __init__(self, message):
123
141
        BzrNewError.__init__(self)
124
142
        self.message = message
126
144
 
127
145
class InvalidEntryName(BzrNewError):
128
146
    """Invalid entry name: %(name)s"""
 
147
 
 
148
    is_user_error = False
 
149
 
129
150
    def __init__(self, name):
130
151
        BzrNewError.__init__(self)
131
152
        self.name = name
163
184
        self.url = url
164
185
 
165
186
 
166
 
class BzrCommandError(BzrError):
167
 
    # Error from malformed user command
168
 
    # This is being misused as a generic exception
169
 
    # please subclass. RBC 20051030
 
187
class BzrCommandError(BzrNewError):
 
188
    """Error from user command"""
 
189
 
 
190
    is_user_error = True
 
191
 
 
192
    # Error from malformed user command; please avoid raising this as a
 
193
    # generic exception not caused by user input.
170
194
    #
171
195
    # I think it's a waste of effort to differentiate between errors that
172
196
    # are not intended to be caught anyway.  UI code need not subclass
173
197
    # BzrCommandError, and non-UI code should not throw a subclass of
174
198
    # BzrCommandError.  ADHB 20051211
 
199
    def __init__(self, msg):
 
200
        self.msg = msg
 
201
 
175
202
    def __str__(self):
176
 
        return self.args[0]
 
203
        return self.msg
177
204
 
178
205
 
179
206
class BzrOptionError(BzrCommandError):
180
 
    """Some missing or otherwise incorrect option was supplied."""
 
207
    """Error in command line options"""
181
208
 
182
209
    
183
 
class StrictCommitFailed(Exception):
184
 
    """Commit refused because there are unknowns in the tree."""
 
210
class StrictCommitFailed(BzrNewError):
 
211
    """Commit refused because there are unknown files in the tree"""
185
212
 
186
213
 
187
214
# XXX: Should be unified with TransportError; they seem to represent the
233
260
 
234
261
class PathNotChild(BzrNewError):
235
262
    """Path %(path)r is not a child of path %(base)r%(extra)s"""
 
263
 
 
264
    is_user_error = False
 
265
 
236
266
    def __init__(self, path, base, extra=None):
237
267
        BzrNewError.__init__(self)
238
268
        self.path = path
280
310
        self.path = path
281
311
 
282
312
 
283
 
class UnsupportedFormatError(BzrError):
284
 
    """Specified path is a bzr branch that we recognize but cannot read."""
285
 
    def __str__(self):
286
 
        return 'unsupported branch format: %s' % self.args[0]
287
 
 
288
 
 
289
 
class UnknownFormatError(BzrError):
290
 
    """Specified path is a bzr branch whose format we do not recognize."""
291
 
    def __str__(self):
292
 
        return 'unknown branch format: %s' % self.args[0]
 
313
class UnsupportedFormatError(BzrNewError):
 
314
    """Unsupported branch format: %(format)s"""
 
315
 
 
316
 
 
317
class UnknownFormatError(BzrNewError):
 
318
    """Unknown branch format: %(format)r"""
293
319
 
294
320
 
295
321
class IncompatibleFormat(BzrNewError):
378
404
 
379
405
class ObjectNotLocked(LockError):
380
406
    """%(obj)r is not locked"""
 
407
 
 
408
    is_user_error = False
 
409
 
381
410
    # this can indicate that any particular object is not locked; see also
382
411
    # LockNotHeld which means that a particular *lock* object is not held by
383
412
    # the caller -- perhaps they should be unified.
445
474
    """Commit refused because there are unknowns in the tree."""
446
475
 
447
476
 
448
 
class NoSuchRevision(BzrError):
 
477
class NoSuchRevision(BzrNewError):
 
478
    """Branch %(branch)s has no revision %(revision)s"""
 
479
 
 
480
    is_user_error = False
 
481
 
449
482
    def __init__(self, branch, revision):
450
483
        self.branch = branch
451
484
        self.revision = revision
452
 
        msg = "Branch %s has no revision %s" % (branch, revision)
453
 
        BzrError.__init__(self, msg)
454
485
 
455
486
 
456
487
class HistoryMissing(BzrError):
461
492
                          % (branch, object_type, object_id))
462
493
 
463
494
 
464
 
class DivergedBranches(BzrError):
 
495
class DivergedBranches(BzrNewError):
 
496
    "These branches have diverged.  Use the merge command to reconcile them."""
 
497
 
 
498
    is_user_error = True
465
499
 
466
500
    def __init__(self, branch1, branch2):
467
 
        BzrError.__init__(self, "These branches have diverged.  Try merge.")
468
501
        self.branch1 = branch1
469
502
        self.branch2 = branch2
470
503
 
471
504
 
472
 
class UnrelatedBranches(BzrCommandError):
473
 
    def __init__(self):
474
 
        msg = "Branches have no common ancestor, and no base revision"\
475
 
            " specified."
476
 
        BzrCommandError.__init__(self, msg)
477
 
 
478
 
 
479
 
class NoCommonAncestor(BzrError):
 
505
class UnrelatedBranches(BzrNewError):
 
506
    "Branches have no common ancestor, and no merge base revision was specified."
 
507
 
 
508
    is_user_error = True
 
509
 
 
510
 
 
511
class NoCommonAncestor(BzrNewError):
 
512
    "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
513
 
480
514
    def __init__(self, revision_a, revision_b):
481
 
        msg = "Revisions have no common ancestor: %s %s." \
482
 
            % (revision_a, revision_b) 
483
 
        BzrError.__init__(self, msg)
 
515
        self.revision_a = revision_a
 
516
        self.revision_b = revision_b
484
517
 
485
518
 
486
519
class NoCommonRoot(BzrError):