4 votes

Comment lancer une exception à partir d'un constructeur d'énumération ?

(En référence à ce billet : Comment lancer une exception à partir d'un constructeur d'enum ? )

J'aimerais vraiment faire la même chose. Exemple de code :

public enum PublicIPWebservice {
    AMAZON_WEB_SERVICES("http://checkip.amazonaws.com"),
    EX_IP("http://api-ams01.exip.org/?call=ip"),
    WHAT_IS_MY_IP("http://automation.whatismyip.com/n09230945.asp");

private URL url;

private PublicIPWebservice(String url) throws MalformedURLException {
    this.url = new URL(url);
}

public URL getURL() {
    return url;
}
}

Le programme devrait se planter si l'url n'était pas correcte, car il s'agirait d'une erreur de programmation, donc attraper l'exception dans le constructeur serait une erreur, n'est-ce pas ?

Quelle est la meilleure façon de résoudre ce problème ?

7voto

yshavit Points 15028

Vous pouvez simplement l'attraper et le relancer comme une AssertionError :

try {
    this.url = new URL(url);
}
catch(MalformedURLException e) {
    throw new AssertionError(e);
}

2voto

Aviram Segal Points 6055

J'aurais juste jeté un RuntimeExpcetion d'un certain type (par exemple IllegalArgumentException )

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        throw new IllegalArgumentException(e);
    }
}

1voto

lpinto.eu Points 774

En général, une erreur de programmation doit être signalée comme une exception non vérifiée car elle "ne se produira pas". Il n'est donc pas nécessaire de se forcer à attraper l'exception dans la classe client.

Cela dit, vous devriez envelopper la création de l'url et lancer une exception non vérifiée.

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException ex) {
        throw new IllegalArgumentException("From input: " + url);
    }
}

Lancer une IllegalArgumentException est un bon choix.

0voto

Bohemian Points 134107

Pourquoi ne serait pas vous voulez attraper cette exception ?

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        // surely you should handle the exception here
    }
}

Que va faire le premier utilisateur de cet enum avec une exception. L'informatique ne s'y attendrait certainement pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X