Skip to content

Refining exception throws  #678

Open
@junghoon-vans

Description

@junghoon-vans

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);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions