133 votes

try / catch versus jette Exception

Ces instructions de code sont-elles équivalentes? Y a-t-il une différence entre eux?

 private void calculateArea() throws Exception {
        ....do something
    }
 

 private void calculateArea() {
        try {
            ....do something

        } catch (Exception e) {
            showException(e);
        }
    }
 

165voto

Jon Skeet Points 692016

Oui, il y a une énorme différence - le dernier avale l'exception (le montrant, il est vrai), alors que le premier vous permettra de propager. (Je suppose qu' showException ne pas le renvoyer.)

Donc, si vous appelez la première méthode et de "faire quelque chose" échoue, alors le visiteur aura à gérer l'exception. Si vous appelez la deuxième méthode et de "faire quelque chose" échoue, alors le visiteur ne verra pas une exception à tous... ce qui est généralement une mauvaise chose, à moins d' showException a véritablement gérée à l'exception, fixe tout ce qui était mal, et en général fait en sorte qu' calculateArea a atteint son but.

Vous serez en mesure de dire cela, parce que vous ne pouvez pas appeler la première méthode sans que soit la capture Exception vous-même ou de déclarer que votre méthode pourrait jeter trop.

29voto

Samit G. Points 2688

Premier throws Exception , l’appelant doit gérer les Exception . Le second attrape et gère Exception interne, de sorte que l'appelant n'a pas à gérer les exceptions.

19voto

Lyle Points 1257

Oui. La version qui déclare throws Exception nécessitera que le code appelant gère l’exception, alors que la version qui le gère explicitement ne le fera pas.

c'est-à-dire simplement:

 performCalculation();
 

vs déplacer le fardeau de la gestion de l'exception à l'appelant:

 try {
    performCalculation();
catch (Exception e) {
    // handle exception
}
 

9voto

Chris Thompson Points 18375

Oui, il y a beaucoup de différence entre eux. Dans le premier bloc de code, vous passez à l'exception du code d'appel. Dans le deuxième bloc de code vous gérer vous-même. La méthode est correcte dépend entièrement de ce que vous êtes en train de faire. Dans certains cas, vous souhaitez que votre code pour gérer l'exception (si un fichier n'est pas trouvé et que vous voulez créer, par exemple), mais dans d'autres, vous voulez le code d'appel pour gérer l'exception (un fichier n'est pas trouvé, et ils ont besoin pour définir un nouveau ou de le créer).

Généralement parlant ainsi, vous ne voulez pas attraper un générique exception. Au lieu de cela, vous aurez envie de captures spécifiques, tels que l' FileNotFoundException ou IOException parce qu'ils peuvent signifier des choses différentes.

1voto

Eyal Schneider Points 11399

Je suppose que par "à l'identique", vous faites référence à un comportement.

Un comportement d'une fonction peut être déterminé par:

1) valeur Renvoyée

2) les exceptions lancées

3) effets Secondaires (j'.e des changements dans le tas, système de fichiers, etc)

Dans ce cas, la première méthode se propage à l'exception, tandis que le second ne renvoie pas vérifié exception, et avale la plupart des décoché des exceptions ainsi, si le comportement EST différent.

Toutefois, si vous garantie que "faire quelque chose" jamais déclenche une exception, alors le problème serait identique (bien que le compilateur va exiger de l'appelant pour gérer l'exception, dans la première version)

--edit--

Du point de vue de la conception d'API, les méthodes sont complètement différents dans leur contrat. Aussi, en jetant de la classe Exception n'est pas recommandé. Essayez de lancer quelque chose de plus précis pour permettre à l'appelant de traiter l'exception mieux.

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