java: ne peut pas relancer une exception: type d’exception non gérée Exception

Je voudrais attraper une exception, le connecter, définir un drapeau, et la renvoyer la même exception

J’ai ce code:

public Boolean doJobWithResult() { boolean result = true; final Feed feed = Feed.findById(feedId); try { feed.fetchContents(); } catch (Exception ex) { result = false; Logger.info("fetching feed(%d) failed", feedId); throw ex; } return result; } 

Mais Eclipse se plaint au lancer de l’ex, en disant que “Type d’exception non gérée”, et me suggère d’append un bloc try-catch autour.

En fait, je veux que le processus appelant cette méthode gère l’exception, et ne la gère pas moi-même … Je veux juste renvoyer true si tout va bien, et le consigner s’il y a une exception

D’autre part, je peux insérer l’exception dans une autre exception, mais je ne peux pas lancer la même.

une idée?

Je pense qu’il y a plusieurs choses à mentionner ici:

  1. Vous voulez que doJobWithResult() renvoie true en cas de succès et false en cas d’échec, ou rien en cas de succès et lève une exception en cas d’échec. Les deux en même temps n’est pas possible. Dans le premier cas, attrapez l’exception, enregistrez-la et renvoyez la valeur false, dans le second cas, modifiez votre signature pour qu’elle void , lève une exception et la traite dans l’appelant.
  2. Il est interdit de capturer une exception, de la consigner et de la relancer. Pourquoi? Parce qu’un appelant potentiel de votre méthode ne sait pas que vous l’enregistrez déjà, et peut également l’enregistrer. Soit une exception (dans ce cas, l’appelant doit s’en occuper) ou interceptez-la et gérez-la (enregistrez-la).
  3. Notez que lancer d’ Exception ne donne aucune indication à l’appelant de votre méthode sur ce qui pourrait éventuellement mal tourner, il est toujours préférable de lancer des exceptions plus spécifiques ou de placer une exception dans une exception définie par l’utilisateur et de la réexaminer.
  4. De plus, si vous lancez Exception , un appelant pourrait être tenté d’attraper Exception sans remarquer que cela capturera également toutes les RuntimeException (car dérivées de Exception ), comportement qui pourrait ne pas être souhaité.

Votre méthode doJobWithResult doit déclarer qu’elle peut générer une exception:

 public Boolean doJobWithResult() { 

devient

 public Boolean doJobWithResult() throws Exception { 

Vous pouvez générer la même exception si vous ajoutez des throws Exception à la signature de votre méthode. Sinon, vous pouvez lancer une exception RuntimeException .

 public Boolean doJobWithResult() { boolean result = true; final Feed feed = Feed.findById(feedId); try { feed.fetchContents(); } catch (Exception ex) { result = false; Logger.info("fetching feed(%d) failed", feedId); throw new RuntimeException(ex); } return result; } 

Dans un tel cas, vous n’aurez pas besoin d’indiquer que public Boolean doJobWithResult() jette quelque chose, mais assurez-vous de le manipuler correctement par la suite (attrapez ou attendez que votre thread s’arrête … c’est une exception après tout RuntimeException).

Si doJobWithResult ne doit pas gérer l’exception, supprimez le bloc catch et ajoutez “Exceptions” à la signature de la méthode. La journalisation des exceptions peut être effectuée dans la classe / méthode qui doit traiter l’exception dans un bloc try / catch correspondant.

Puisque l’ Exception est cochée , une alternative à la capture de l’ Exception consiste à déclarer votre méthode comme la projetant:

 public Boolean doJobWithResult() throws Exception { // ... } 

Il n’est pas nécessaire de définir le résultat sur false dans le bloc catch, car la valeur ne sera pas renvoyée (car nous lançons une exception).

Votre méthode doit également déclarer qu’elle lève une exception et que le client sera obligé de la gérer.

Pensez également à utiliser une exception plus spécifique qui sera levée dans ce cas particulier.

Ajouter des throws Exception à votre méthode. Vous n’avez également pas besoin d’append result = false; dans votre bloc de catch .

Je pense que la façon dont vous gérez cette exception est vraiment appropriée si une défaillance de la méthode feed.fetchContents () ne peut pas être récupérée. (Idée vaut mieux arrêter que de continuer) En dehors de cela, je vous suggérerais d’utiliser une hiérarchie d’exception plus spécifique.

Et une autre chose que j’ai tirée de java book est que si vous écrivez une telle méthode, vous devez documenter avec @throw (en commentaires) avec la raison.

Vous pouvez lancer une exception non contrôlée

  Logger.info("fetching feed(%d) failed", feedId); throw new RuntimeException(ex);