diff --git a/src/CDSAPI.jl b/src/CDSAPI.jl index 39a5309..ea97b39 100644 --- a/src/CDSAPI.jl +++ b/src/CDSAPI.jl @@ -22,11 +22,28 @@ function retrieve(name, params, filename; wait=1.0) end end - response = HTTP.request("POST", - creds["url"] * "/retrieve/v1/processes/$name/execute", - ["PRIVATE-TOKEN" => creds["key"]], - body=JSON.json(Dict("inputs" => params)) - ) + try + response = HTTP.request("POST", + creds["url"] * "/retrieve/v1/processes/$name/execute", + ["PRIVATE-TOKEN" => creds["key"]], + body=JSON.json(Dict("inputs" => params)) + ) + catch e + if e isa HTTP.StatusError + if e.status == 404 + throw(ArgumentError(""" + The requested dataset $name was not found. + """)) + elseif 400 ≤ e.status < 500 + throw(ArgumentError(""" + The request is in a bad format: + $params + """)) + end + end + throw(e) + end + body = JSON.parse(String(response.body)) data = Dict("status" => "queued") diff --git a/test/retrieve.jl b/test/retrieve.jl index 3f866b7..fc26799 100644 --- a/test/retrieve.jl +++ b/test/retrieve.jl @@ -65,4 +65,17 @@ rm(filepath) rm(ewq_file) end + + @testset "Bad requests errors are catched" begin + goodname = "reanalysis-era5-single-levels" + badname = "bad-dataset" + badrequest = """{ + "this": "is", + "a": "bad", + "re": ["quest"] + }""" + + @test_throws ArgumentError CDSAPI.retrieve(goodname, badrequest, "unreachable") + @test_throws ArgumentError CDSAPI.retrieve(badname, badrequest, "unreachable") + end end