From fcbf77cb9a101bc7733943a6f8e12aad2877acf5 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Mon, 11 Oct 2021 13:12:44 +0000
Subject: [PATCH] Catch incomplete JSON files being read.

---
 bilby/core/result.py     |  9 ++++++++-
 test/core/result_test.py | 19 +++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/bilby/core/result.py b/bilby/core/result.py
index 060ce6430..99efa4912 100644
--- a/bilby/core/result.py
+++ b/bilby/core/result.py
@@ -538,10 +538,17 @@ class Result(object):
     @classmethod
     @docstring(_load_doctstring.format(format="json"))
     def from_json(cls, filename=None, outdir=None, label=None, gzip=False):
+        from json.decoder import JSONDecodeError
+
         filename = _determine_file_name(filename, outdir, label, 'json', gzip)
 
         if os.path.isfile(filename):
-            dictionary = load_json(filename, gzip)
+            try:
+                dictionary = load_json(filename, gzip)
+            except JSONDecodeError as e:
+                raise IOError(
+                    "JSON failed to decode {} with message {}".format(filename, e)
+                )
             try:
                 return cls(**dictionary)
             except TypeError as e:
diff --git a/test/core/result_test.py b/test/core/result_test.py
index b2a7c24c1..f49e4a3a2 100644
--- a/test/core/result_test.py
+++ b/test/core/result_test.py
@@ -134,6 +134,25 @@ class TestResult(unittest.TestCase):
         with self.assertRaises(IOError):
             bilby.core.result.read_in_result(filename="not/a/file.json")
 
+        with self.assertRaises(IOError):
+            incomplete_json = """
+{
+  "label": "label",
+  "outdir": "outdir",
+  "sampler": "dynesty",
+  "log_evidence": 0,
+  "log_evidence_err": 0,
+  "log_noise_evidence": 0,
+  "log_bayes_factor": 0,
+  "priors": {
+    "chirp_mass": {
+"""
+            with open("{}/incomplete.json".format(self.result.outdir), "wb") as ff:
+                ff.write(incomplete_json)
+            bilby.core.result.read_in_result(
+                filename="{}/incomplete.json".format(self.result.outdir)
+            )
+
     def test_unset_priors(self):
         result = bilby.core.result.Result(
             label="label",
-- 
GitLab