Skip to content

Commit 1b9f9f2

Browse files
committed
Catch allowed exceptions
1 parent fc93029 commit 1b9f9f2

File tree

1 file changed

+30
-21
lines changed

1 file changed

+30
-21
lines changed

src/zarr/storage/object_store.py

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
from zarr.core.buffer import Buffer, BufferPrototype
2929
from zarr.core.common import BytesLike
3030

31+
ALLOWED_EXCEPTIONS: tuple[type[Exception], ...] = (
32+
FileNotFoundError,
33+
IsADirectoryError,
34+
NotADirectoryError,
35+
)
36+
3137

3238
class ObjectStore(Store):
3339
"""A Zarr store that uses obstore for fast read/write from AWS, GCP, and Azure.
@@ -77,27 +83,30 @@ def __setstate__(self) -> None:
7783

7884
async def get(
7985
self, key: str, prototype: BufferPrototype, byte_range: ByteRequest | None = None
80-
) -> Buffer:
81-
if byte_range is None:
82-
resp = await obs.get_async(self.store, key)
83-
return prototype.buffer.from_bytes(await resp.bytes_async())
84-
elif isinstance(byte_range, RangeByteRequest):
85-
resp = await obs.get_range_async(
86-
self.store, key, start=byte_range.start, end=byte_range.end
87-
)
88-
return prototype.buffer.from_bytes(memoryview(resp))
89-
elif isinstance(byte_range, OffsetByteRequest):
90-
resp = await obs.get_async(
91-
self.store, key, options={"range": {"offset": byte_range.offset}}
92-
)
93-
return prototype.buffer.from_bytes(await resp.bytes_async())
94-
elif isinstance(byte_range, SuffixByteRequest):
95-
resp = await obs.get_async(
96-
self.store, key, options={"range": {"suffix": byte_range.suffix}}
97-
)
98-
return prototype.buffer.from_bytes(await resp.bytes_async())
99-
else:
100-
raise ValueError(f"Unexpected input to `get`: {byte_range}")
86+
) -> Buffer | None:
87+
try:
88+
if byte_range is None:
89+
resp = await obs.get_async(self.store, key)
90+
return prototype.buffer.from_bytes(await resp.bytes_async())
91+
elif isinstance(byte_range, RangeByteRequest):
92+
resp = await obs.get_range_async(
93+
self.store, key, start=byte_range.start, end=byte_range.end
94+
)
95+
return prototype.buffer.from_bytes(memoryview(resp))
96+
elif isinstance(byte_range, OffsetByteRequest):
97+
resp = await obs.get_async(
98+
self.store, key, options={"range": {"offset": byte_range.offset}}
99+
)
100+
return prototype.buffer.from_bytes(await resp.bytes_async())
101+
elif isinstance(byte_range, SuffixByteRequest):
102+
resp = await obs.get_async(
103+
self.store, key, options={"range": {"suffix": byte_range.suffix}}
104+
)
105+
return prototype.buffer.from_bytes(await resp.bytes_async())
106+
else:
107+
raise ValueError(f"Unexpected input to `get`: {byte_range}")
108+
except ALLOWED_EXCEPTIONS:
109+
return None
101110

102111
async def get_partial_values(
103112
self,

0 commit comments

Comments
 (0)