3737 BadResponseFormat ,
3838 MethodUnavailable ,
3939 ProviderConnectionError ,
40+ RequestTimedOut ,
4041 TaskNotRunning ,
4142 Web3RPCError ,
4243 Web3TypeError ,
8990
9091
9192NULL_RESPONSES = [None , HexBytes ("0x" ), "0x" ]
93+ KNOWN_REQUEST_TIMEOUT_MESSAGING = {
94+ # Note: It's important to be very explicit here and not too broad. We don't want
95+ # to accidentally catch a message that is not for a request timeout. In the worst
96+ # case, we raise something more generic like `Web3RPCError`. JSON-RPC unfortunately
97+ # has not standardized error codes for request timeouts.
98+ "request timed out" , # go-ethereum
99+ }
92100METHOD_NOT_FOUND = - 32601
93101
94102
@@ -185,6 +193,7 @@ def _validate_response(
185193 response , 'Response must include either "error" or "result".'
186194 )
187195 elif "error" in response :
196+ web3_rpc_error : Optional [Web3RPCError ] = None
188197 error = response ["error" ]
189198
190199 # raise the error when the value is a string
@@ -202,7 +211,7 @@ def _validate_response(
202211 response , 'error["code"] is required and must be an integer value.'
203212 )
204213 elif code == METHOD_NOT_FOUND :
205- exception = MethodUnavailable (
214+ web3_rpc_error = MethodUnavailable (
206215 repr (error ),
207216 rpc_response = response ,
208217 user_message = (
@@ -211,9 +220,6 @@ def _validate_response(
211220 "currently enabled."
212221 ),
213222 )
214- logger .error (exception .user_message )
215- logger .debug (f"RPC error response: { response } " )
216- raise exception
217223
218224 # errors must include a message
219225 error_message = error .get ("message" )
@@ -222,9 +228,26 @@ def _validate_response(
222228 response , 'error["message"] is required and must be a string value.'
223229 )
224230
225- apply_error_formatters (error_formatters , response )
231+ if any (
232+ # parse specific timeout messages
233+ timeout_str in error_message .lower ()
234+ for timeout_str in KNOWN_REQUEST_TIMEOUT_MESSAGING
235+ ):
236+ web3_rpc_error = RequestTimedOut (
237+ repr (error ),
238+ rpc_response = response ,
239+ user_message = (
240+ "The request timed out. Check the connection to your node and "
241+ "try again."
242+ ),
243+ )
244+
245+ if web3_rpc_error is None :
246+ # if no condition was met above, raise a more generic `Web3RPCError`
247+ web3_rpc_error = Web3RPCError (repr (error ), rpc_response = response )
248+
249+ response = apply_error_formatters (error_formatters , response )
226250
227- web3_rpc_error = Web3RPCError (repr (error ), rpc_response = response )
228251 logger .error (web3_rpc_error .user_message )
229252 logger .debug (f"RPC error response: { response } " )
230253 raise web3_rpc_error
0 commit comments