Skip to content

Commit 16d9747

Browse files
committed
ENH: improve error handling in read_in_result
1 parent f5c2d26 commit 16d9747

1 file changed

Lines changed: 42 additions & 10 deletions

File tree

bilby/core/result.py

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,41 @@ def read_in_result(filename=None, outdir=None, label=None, extension=None, gzip=
117117
if extension == 'gz': # gzipped file
118118
extension = os.path.splitext(os.path.splitext(filename)[0])[1].lstrip('.')
119119

120-
if 'json' == extension:
121-
result = result_class.from_json(filename=filename)
122-
elif extension in ['hdf5', 'h5']:
123-
result = result_class.from_hdf5(filename=filename)
124-
elif extension in ['pkl', 'pickle']:
125-
result = result_class.from_pickle(filename=filename)
126-
elif extension is None:
120+
if extension is None:
121+
raise ValueError("No filetype extension provided and could not be inferred from filename")
122+
123+
extension = extension.lower()
124+
read_functions = {
125+
'json': result_class.from_json,
126+
'hdf5': result_class.from_hdf5,
127+
'h5': result_class.from_hdf5,
128+
'pkl': result_class.from_pickle,
129+
'pickle': result_class.from_pickle,
130+
}
131+
if extension not in read_functions:
127132
raise ValueError(
128-
"No filetype extension provided and could not be inferred from filename"
133+
f"Filetype {extension} not understood, known types are {list(read_functions.keys())}"
129134
)
130-
else:
131-
raise ValueError("Filetype {} not understood".format(extension))
135+
136+
func = read_functions[extension]
137+
138+
# Raise IO errors since this is what the caching relies on
139+
# Catch all other exceptions and raise a FileLoadError
140+
try:
141+
result = func(filename=filename)
142+
except IOError:
143+
raise IOError(
144+
f"Failed to read in file {filename} using "
145+
f"`{result_class.__name__}.{func.__name__}` "
146+
f"(extension={extension}). "
147+
"This is likely because the file does not exist or is not a valid bilby result."
148+
)
149+
except Exception as e:
150+
raise FileLoadError(
151+
f"Failed to read in file {filename} using "
152+
f"`{result_class.__name__}.{func.__name__}` "
153+
f"(extension={extension}). The error was: {e}"
154+
) from e
132155
return result
133156

134157

@@ -815,6 +838,10 @@ def save_to_file(self, filename=None, overwrite=False, outdir=None,
815838
# if not, it will fall back to the default
816839
if ext in EXTENSIONS:
817840
if extension is None:
841+
logger.debug(
842+
f"Inferred extension '{ext}' from filename '{filename}'. "
843+
"Using this extension for saving."
844+
)
818845
extension = ext
819846
elif ext != extension:
820847
message = (
@@ -824,6 +851,7 @@ def save_to_file(self, filename=None, overwrite=False, outdir=None,
824851
logger.warning(message)
825852

826853
if extension is None:
854+
logger.info("No extension given, defaulting to JSON.")
827855
extension = 'json'
828856

829857
if extension is True:
@@ -2312,3 +2340,7 @@ class ResultListError(ResultError):
23122340

23132341
class FileMovedError(ResultError):
23142342
""" Exceptions that occur when files have been moved """
2343+
2344+
2345+
class FileLoadError(ResultError):
2346+
""" Exceptions that occur when files cannot be loaded """

0 commit comments

Comments
 (0)