Source code for handtruck.exceptions
1import types
2
3import httpx
4
5
[docs]
6class ConflictError(Exception):
7 """
8 There was a conflict in a multipart operation.
9 """
10
11
12# FIXME: Subclassing httpx.HTTPStatusError would be more appropriate
13# Or maybe just not subclassing any error
14
[docs]
15class S3Error(httpx.HTTPError):
16 """
17 Parent class for errors reported by the server
18 """
19 request: httpx.Request
20 response: httpx.Response
21
22 def __init__(self, message, resource: str|None = None, request_id: str|None = None, **props):
23 super().__init__(message)
24 self.resource = resource
25 self.request_id = request_id
26 vars(self).update(props)
27
28 if resource:
29 self.add_note(f"resource: {resource}")
30 if request_id:
31 self.add_note(f"request_id: {request_id}")
32
33 for name, value in sorted(props.items()):
34 self.add_note(f"{name}: {value}")
35
36
37def __getattr__(name):
38 """
39 Generate an exception for the error returned by the server.
40 """
41 if name in ('AwsError', 'AwsUploadError', 'AwsDownloadError'):
42 raise AttributeError(f"Exception {name} has been removed")
43
44 def body(ns):
45 ns['__module__'] = __name__
46 ns['__qualname__'] = name
47
48 cls = types.new_class(
49 name,
50 (S3Error,),
51 {},
52 body
53 )
54 globals()[name] = cls
55 return cls