I use
try
JSON.parsefile(fname) do stuff
content = "Nothing ..."
end
catch
content = "File "*fname*" not found! ";
end
But it always returns that file was not found despite that JSON.parsefile(fname) works …
You seem to be confused about what the do
syntax does. Manual entry for do
. This
JSON.parsefile(fname) do stuff
content = "Nothing ..."
end
is equivalent to
JSON.parsefile(stuff -> content = "Nothing ...", fname)
i.e. the do
syntax invokes the function (JSON.parsefile
) with an anonymous function as the first argument. Since there is no method of JSON.parsefile
that accepts a function as first argument this will always be a MethodError
and you will always end up in the catch
block. Indeed, if you had tried just the code in your try
block you would have seen this.
5 Likes
To elaborate a bit more on @fredrikekre’s comment:
JSON.parsefile(fname) do stuff
content = "Nothing ..."
end
This statement would need to call a version of JSON.parsefile()
that defines:
parsefile(function_to_do::Function, filename::AbstractString, [other optional arguments here])
And that version of parsefile()
would need to correctly call (expect) the anonymous function you defined. In other words, it would have to call:
function_to_do(stuff)
somewhere in its code. This does not happen by magic. Someone has to implement this version of the function. But if you check the methods defined in JSON
, you will notice that only one method exists, and it does not have ::Function
as its first argument:
julia> methods(JSON.parsefile)
# 1 method for generic function "parsefile":
[1] parsefile(filename::AbstractString; dicttype, inttype, null, allownan, use_mmap) in JSON.Parser at /home/alain/.julia/packages/JSON/3rsiS/src/Parser.jl:518
The try
pitfall
When you get unexpected behaviour like this, I highly recommend commenting out the try/catch/end
block to see what is happening. Normally, Julia’s exception system would have shown you a helpful error message, but it gets suppressed by your try/catch
block:
ERROR: MethodError: no method matching parsefile(::var"#7#8", ::String)
Stacktrace:
[1] top-level scope at REPL[8]:1
Now that you understand how function()-do
statements work, you can see that Julia cannot find a version of parsefile()
that accepts a ::Function
as its first argument (even if it displays a message with the somewhat cryptic ::var"#7#8"
type in Julia v1.3.1).
1 Like