Skip to content

Commit d6870d9

Browse files
committed
dev
1 parent 3ecd63c commit d6870d9

File tree

3 files changed

+62
-52
lines changed

3 files changed

+62
-52
lines changed

cf/read_write/read.py

Lines changed: 54 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from urllib.parse import urlparse
77

88
import cfdm
9+
from cfdm.read_write.exceptions import UnknownFileFormatError
910
from cfdm.read_write.netcdf import NetCDFRead
1011

1112
from ..aggregate import aggregate as cf_aggregate
@@ -864,51 +865,52 @@ def _read_a_file(
864865
fmt = (fmt,)
865866

866867
fmt = set(fmt)
867-
868-
errors = []
869-
870-
try:
871-
out = super().__new__(
872-
cls,
873-
filename,
874-
external=external,
875-
extra=extra,
876-
verbose=verbose,
877-
warnings=warnings,
878-
mask=mask,
879-
unpack=unpack,
880-
warn_valid=warn_valid,
881-
domain=domain,
882-
storage_options=storage_options,
883-
netcdf_backend=netcdf_backend,
884-
dask_chunks=dask_chunks,
885-
store_hdf5_chunks=store_hdf5_chunks,
886-
cache=cache,
887-
cfa=cfa,
888-
cfa_write=cfa_write,
889-
to_memory=to_memory,
890-
squeeze=squeeze,
891-
unsqueeze=unsqueeze,
892-
fmt=fmt,
893-
ignore_unknown_format=ignore_read_error,
894-
)
895-
except RuntimeError as error:
896-
if fmt is None or fmt.intersection(("UM",)):
897-
# Set to None to indicate that we should try other
898-
# file formats
899-
errors.append(error)
900-
out = None
901-
else:
902-
raise
903868
else:
904-
if out or not ignore_read_error:
905-
ftypes.append("netCDF")
869+
fmt = set(("netCDF", "CDL", "UM"))
870+
871+
file_format_errors = []
872+
873+
out = None
874+
if fmt.intersection(("netCDF", "CDL")):
875+
try:
876+
out = super().__new__(
877+
cls,
878+
filename,
879+
external=external,
880+
extra=extra,
881+
verbose=verbose,
882+
warnings=warnings,
883+
mask=mask,
884+
unpack=unpack,
885+
warn_valid=warn_valid,
886+
domain=domain,
887+
storage_options=storage_options,
888+
netcdf_backend=netcdf_backend,
889+
dask_chunks=dask_chunks,
890+
store_hdf5_chunks=store_hdf5_chunks,
891+
cache=cache,
892+
cfa=cfa,
893+
cfa_write=cfa_write,
894+
to_memory=to_memory,
895+
squeeze=squeeze,
896+
unsqueeze=unsqueeze,
897+
fmt=fmt,
898+
ignore_unknown_format=ignore_read_error,
899+
)
900+
except UnknownFileFormatError as error:
901+
fmt.difference_update(("netCDF", "CDL"))
902+
if fmt:
903+
file_format_errors.append(error)
904+
else:
905+
raise
906906
else:
907-
# Set to None to indicate that we should try other
908-
# file formats
909-
out = None
907+
if out or not ignore_read_error:
908+
# Zero or more fields/domains were successfully read
909+
fmt = set()
910+
file_format_errors = ()
911+
ftypes.append("netCDF")
910912

911-
if out is None:
913+
if fmt.intersection(("UM",)):
912914
if not um:
913915
um = {}
914916

@@ -927,21 +929,25 @@ def _read_a_file(
927929
unsqueeze=unsqueeze,
928930
domain=domain,
929931
)
930-
except Exception as error:
931-
errors.append(error)
932-
errors = '\n'.join(map(str, errors))
933-
raise RuntimeError(f"\n{errors}")
932+
except UnknownFileFormatError as error:
933+
fmt.difference_update(("UM",))
934+
file_format_errors.append(error)
934935
else:
935936
if out or not ignore_read_error:
937+
file_format_errors = ()
936938
ftypes.append("UM")
937-
939+
938940
# UM fields are aggregated intrafile prior to
939941
# interfile aggregation
940942
if aggregate:
941943
# Set defaults specific to UM fields
942944
if "strict_units" not in aggregate_options:
943945
aggregate_options["relaxed_units"] = True
944-
946+
947+
if file_format_errors:
948+
file_format_errors = "\n".join(map(str, file_format_errors))
949+
raise UnknownFileFormatError(f"\n{file_format_errors}")
950+
945951
# Return the fields/domains
946952
if domain:
947953
return DomainList(out)

cf/read_write/um/umread.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import dask.array as da
1010
import numpy as np
1111
from cfdm import Constructs, is_log_level_info
12+
from cfdm.read_write.exceptions import UnknownFileFormatError
1213
from dask.array.core import getter, normalize_chunks
1314
from dask.base import tokenize
1415
from netCDF4 import date2num as netCDF4_date2num
@@ -3590,13 +3591,15 @@ def _open_um_file(
35903591
fmt=fmt,
35913592
parse=parse,
35923593
)
3593-
except Exception as error:
3594+
except Exception:
35943595
try:
35953596
f.close_fd()
35963597
except Exception:
35973598
pass
35983599

3599-
raise Exception(error)
3600+
raise UnknownFileFormatError(
3601+
f"Can't open {filename} as a PP or UM dataset"
3602+
)
36003603

36013604
self._um_file = f
36023605
return f

cf/umread_lib/umfile.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from functools import cmp_to_key
33

44
import numpy
5+
from cfdm.read_write.exceptions import UnknownFileFormatError
56

67
from . import cInterface
78
from .extraData import ExtraDataUnpacker
@@ -132,8 +133,8 @@ def _detect_file_type(self):
132133
file_type_obj = c.detect_file_type(self.fd)
133134
except Exception:
134135
self.close_fd()
135-
raise IOError(
136-
f"Can't open file {self.path} as a PP or UM dataset"
136+
raise UnknownFileFormatError(
137+
f"Can't open {self.path} as a PP or UM dataset"
137138
)
138139

139140
d = c.file_type_obj_to_dict(file_type_obj)

0 commit comments

Comments
 (0)