Skip to content

Commit fdf4494

Browse files
authored
Ensure our error handlers catch everything
1 parent b6042f1 commit fdf4494

File tree

1 file changed

+35
-31
lines changed

1 file changed

+35
-31
lines changed

src/core.jl

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,17 @@ function Base.run(x::JSONRPCEndpoint)
9191
x.status == :idle || error("Endpoint is not idle.")
9292

9393
x.write_task = @async try
94-
for msg in x.out_msg_queue
95-
if isopen(x.pipe_out)
96-
write_transport_layer(x.pipe_out, msg)
97-
else
98-
# TODO Reconsider at some point whether this should be treated as an error.
99-
break
94+
try
95+
for msg in x.out_msg_queue
96+
if isopen(x.pipe_out)
97+
write_transport_layer(x.pipe_out, msg)
98+
else
99+
# TODO Reconsider at some point whether this should be treated as an error.
100+
break
101+
end
100102
end
103+
finally
104+
close(x.out_msg_queue)
101105
end
102106
catch err
103107
bt = catch_backtrace()
@@ -106,37 +110,39 @@ function Base.run(x::JSONRPCEndpoint)
106110
else
107111
Base.display_error(stderr, err, bt)
108112
end
109-
finally
110-
close(x.out_msg_queue)
111113
end
112114

113115
x.read_task = @async try
114-
while true
115-
message = read_transport_layer(x.pipe_in)
116-
117-
if message === nothing || x.status == :closed
118-
break
119-
end
116+
try
117+
while true
118+
message = read_transport_layer(x.pipe_in)
120119

121-
message_dict = JSON.parse(message)
120+
if message === nothing || x.status == :closed
121+
break
122+
end
122123

123-
if haskey(message_dict, "method")
124-
try
125-
put!(x.in_msg_queue, message_dict)
126-
catch err
127-
if err isa InvalidStateException
128-
break
129-
else
130-
rethrow(err)
124+
message_dict = JSON.parse(message)
125+
126+
if haskey(message_dict, "method")
127+
try
128+
put!(x.in_msg_queue, message_dict)
129+
catch err
130+
if err isa InvalidStateException
131+
break
132+
else
133+
rethrow(err)
134+
end
131135
end
132-
end
133-
else
134-
# This must be a response
135-
id_of_request = message_dict["id"]
136+
else
137+
# This must be a response
138+
id_of_request = message_dict["id"]
136139

137-
channel_for_response = x.outstanding_requests[id_of_request]
138-
put!(channel_for_response, message_dict)
140+
channel_for_response = x.outstanding_requests[id_of_request]
141+
put!(channel_for_response, message_dict)
142+
end
139143
end
144+
finally
145+
close(x.in_msg_queue)
140146
end
141147
catch err
142148
bt = catch_backtrace()
@@ -145,8 +151,6 @@ function Base.run(x::JSONRPCEndpoint)
145151
else
146152
Base.display_error(stderr, err, bt)
147153
end
148-
finally
149-
close(x.in_msg_queue)
150154
end
151155

152156
x.status = :running

0 commit comments

Comments
 (0)