1
votes

Comment appeler une méthode qui lève une exception dans le bloc catch?

J'essaie d'avoir une méthode HandleException qui peut gérer diverses exceptions.

Le problème est que ma fonction renvoie une valeur. Mais si j'utilise HandleException dans mon bloc catch, Java se plaint que la fonction ne renvoie pas de valeur même si mon HandleException lève toujours une exception.

Quel est un bon moyen de corriger ce? Merci!

Voici un exemple de code.

try {
    ...
} catch (Exception1) {
    Log exception
    throw appropriate exception
} catch (Exception2) {
    Log exception
    throw appropriate exception
}

Dans ma classe d'origine, j'ai beaucoup de méthodes qui ont ce format.

XXX

J'essaie de trouver une manière plus propre d'écrire les blocs catch.


4 commentaires

Je ne comprends pas votre question ... qu'est-ce que vous essayez de faire, de lancer et d'exception et de l'attraper dans une autre méthode?


Votre code MyException.java ne se compile pas. Voici quelques notes utiles sur les exceptions et leur gestion dans les didacticiels Java d'Oracle Exceptions < / a>.


essayez static int handleException (Exception e) ... .. puis renvoyez-le dans le bloc catch.


Comme je l'ai mentionné, il ne s'agit que d'un exemple de code que j'ai écrit pour expliquer le plus gros problème que j'essaie de résoudre.


3 Réponses :


5
votes

Ceci est dû au fait que l'exception qui a été lancée sur handleException est déjà interceptée par le bloc catch de la méthode foo. Ainsi, la méthode foo ne lève plus d'exception faisant que le bloc catch ne renvoie rien. Donc, si la méthode bar lève une exception, elle ira au bloc catch mais comme le bloc catch ne renvoie rien, Java exécute les lignes après le bloc catch mais quand il atteint la fin, il renvoie une erreur indiquant que "la méthode doit renvoyer un result of type int "puisque vous n'avez pas d'instruction return.

Vous devriez changer cette partie.

public class MyException {

    static int foo(int num) throws Exception {
        try {
            return bar(num);
        } catch (Exception e) {
            throw handleException(e); // this will throw the exception from the handleException
        //    throw new Exception("Exception in foo", e);
        }
    }

    static int bar(int num) throws IllegalArgumentException {
        if (num < 0) {
            throw new IllegalArgumentException("Num less than 0");
        }
        return num;
    }

    // This method now returns an exception, instead of throwing an exception
    static Exception handleException(Exception e) {
        System.err.println("Handling Exception: " + e);
        return new Exception(e);
    }

    public static void main(String[] args) throws Exception {
        int value = foo(-1);
    }
}


0 commentaires

1
votes

foo type de retour de la méthode est int et le type de retour de handleException est void , c'est pourquoi le compilateur erreur.

(1) Ici, vous pouvez résoudre ce problème comme suit:

Relancez l'exception telle quelle.

throw handleException(e);

(2) De plus, si vous voulez lancer une nouvelle exception créée, changez le type de retour de handleException en Exception . Utilisez

try{
      return bar(num);
}
catch(Exception e){
      handleException(e);
      throw e;
}


0 commentaires

1
votes

Dans ma classe d'origine, j'ai beaucoup de méthodes qui ont ce format ... je J'essaie de trouver une manière plus propre d'écrire les blocs catch.

Je pense que le problème est davantage lié à la compréhension de la manière dont les exceptions sont gérées dans les applications; c'est un problème de conception, en général.

Considérez la méthode: int foo (int num) lance une exception

La méthode foo renvoie une valeur, intercepte une exception / gère et lève également une exception. Considérez ces aspects.

Si la méthode s'exécute normalement, sans erreur, elle renvoie une valeur. Sinon, s'il y a un problème avec sa logique, lève une exception dans la méthode, l'attrape et la gère dans le bloc catch de la méthode. La méthode lève également une exception.

Il y a deux options à considérer ici:

  1. Relancez une exception, comme une exception métier / application personnalisée (il suffit de la consigner et de renvoyer la même exception ou une exception personnalisée), qui doit être gérée ailleurs - c'est-à-dire dans une méthode d'appel dans la pile.
  2. / li>
  3. Gérer l'exception: cela signifie que la méthode prend soin de l'exception. Une certaine logique métier / d'application se produit dans la gestion des exceptions. Et, la méthode renvoie une valeur.

Le but d'une méthode lançant une exception est qu'elle est gérée ailleurs, comme dans une méthode appelante. La gestion peut être comme la récupération d'un problème d'exception ou l'affichage d'un message ou l'annulation d'une transaction ou tout ce que la logique métier définit.

L'exception est-elle levée en raison d'un problème de logique métier? Si tel est le cas, il est probable que vous montriez un message à l'utilisateur ou que vous fassiez une autre logique à son sujet et / que vous preniez d'autres mesures pour le récupérer - si les règles métier le permettent.

Si l'exception est levée suite à une situation qui n'est pas récupérable par la logique de l'application, effectuez les actions appropriées.

En fin de compte, vous devez avoir une exigence claire sur la raison pour laquelle une exception est levée, ce que vous faites avec les exceptions levées et comment vous les gérez dans l'application. L'exigence d'application / logique / règles influence la conception de la gestion des exceptions dans le code.

Notes (modifier-ajouter) :


0 commentaires