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.
3 Réponses :
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); } }
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; }
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:
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) :
try-catch-finally
à prendre en compte (ainsi que divers nouveaux fonctionnalités d'exception introduites avec Java 7).
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.