Refining exception throws
junghoon-vans opened this issue · comments
Description
Currently, the exceptions thrown are all MeilisearchException
.
This makes it difficult for the user to specify which exception was thrown.
Basic example
The way to fix this is to throw all exceptions as-is.
Instead, the practice of creating and throwing MeilsearchException
directly should be eliminated.
AS-IS
public <T> HttpResponse<T> execute(HttpRequest request) throws MeilisearchException {
try {
Request okRequest = buildRequest(request);
Response response = client.newCall(okRequest).execute();
return buildResponse(response);
} catch (MalformedURLException e) {
throw new MeilisearchException(e); // do not throw MeilisearchException directly!
} catch (SocketTimeoutException e) {
throw new MeilisearchTimeoutException(e);
} catch (IOException e) {
throw new MeilisearchCommunicationException(e);
}
}
If the user wants to get a specific exception, they have to compare if it is castable and perform the cast.
TO-BE
public <T> HttpResponse<T> execute(HttpRequest request)
throws MeilisearchURLException, MeilisearchTimeoutException, MeilisearchCommunicationException {
try {
Request okRequest = buildRequest(request);
Response response = client.newCall(okRequest).execute();
return buildResponse(response);
} catch (MalformedURLException e) {
throw new MeilisearchURLException(e); // for example
} catch (SocketTimeoutException e) {
throw new MeilisearchTimeoutException(e);
} catch (IOException e) {
throw new MeilisearchCommunicationException(e);
}
}
With this change, users will be able to receive verbose exceptions(e.g. MeilisearchURLException
..) as they are,
or as a MeilisearchException
as they do now.
Other
This issue has great synergy when applied with #677.
If all exceptions were RuntimeException
, we wouldn't need any code to re-throw.
public <T> HttpResponse<T> execute(HttpRequest request) { // we don't have to re-throw!
try {
Request okRequest = buildRequest(request);
Response response = client.newCall(okRequest).execute();
return buildResponse(response);
} catch (MalformedURLException e) {
throw new MeilisearchURLException(e); // for example
} catch (SocketTimeoutException e) {
throw new MeilisearchTimeoutException(e);
} catch (IOException e) {
throw new MeilisearchCommunicationException(e);
}
}
Hello @junghoon-vans
thanks for the suggestion
Feel free to open PRs so that we better see what you mean. I'm not sure I like the MeilisearchURLException
because the meaning is not explicit 😅 but I trust you for the global change!
Feel free to tackle #677 too