diff --git a/modules/standard/JSON.chpl b/modules/standard/JSON.chpl index 9e2a1d1c3ea3..7d2705939308 100644 --- a/modules/standard/JSON.chpl +++ b/modules/standard/JSON.chpl @@ -1185,7 +1185,12 @@ module JSON { proc fromJson(jsonString: string, type loadAs): loadAs throws { var fileReader = openStringReader(jsonString, deserializer=new jsonDeserializer()); - return fileReader.read(loadAs); + // we want `return fileReader.read(loadAs)`. But that ends up using a + // non-throwing compiler-generated initializer. That prevents the user to + // catch errors that are due to malformed jsonString. + var ret: loadAs; + fileReader.read(ret); + return ret; } /* Given a Chapel value, serialize it into a JSON string using the diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.chpl b/test/io/serializers/jsonHelpers/fromJsonThrows.chpl new file mode 100644 index 000000000000..d4c9551c7c17 --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.chpl @@ -0,0 +1,20 @@ +import IO, JSON; + +record myRec { + var field: int; +} + +var inFile = IO.open("fromJsonThrows.in", IO.ioMode.r); +var inReader = inFile.reader(); + +var rec: myRec; + +proc main() throws { + try { + rec = JSON.fromJson(inReader.readAll(string), myRec); + writeln(rec); + } + catch err: IllegalArgumentError { + writeln("Caught the error correctly"); + } +} diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.cleanfiles b/test/io/serializers/jsonHelpers/fromJsonThrows.cleanfiles new file mode 100644 index 000000000000..6fe0a2a75c1e --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.cleanfiles @@ -0,0 +1 @@ +fromJsonThrows.in diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.good b/test/io/serializers/jsonHelpers/fromJsonThrows.good new file mode 100644 index 000000000000..c32344df3cbb --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.good @@ -0,0 +1 @@ +Caught the error correctly diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.preexec b/test/io/serializers/jsonHelpers/fromJsonThrows.preexec new file mode 100755 index 000000000000..54898d467cc3 --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.preexec @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "{\"fiel\":10}" > fromJsonThrows.in