2010-09-20 2 views
0

Cela pourrait être un peu d'une question stupide, mais il a été me casser les pieds alors voici vaExceptions et annulation

Je sais que les conseils normale est que les exceptions ne sont destinés à être utilisés dans des circonstances exceptionnelles, mais je lis aussi les gens qui préconisent d'utiliser des exceptions lorsqu'une méthode ne remplit pas son contrat

Annulation me semble s'asseoir dans un peu d'une zone grise entre ces deux cas

Sans exceptions si votre classe a beaucoup d'actions résiliables votre code finit par vérifier les codes d'erreur partout

L'annulation peut-elle être considérée comme exceptionnelle dans ce contexte?

Répondre

0

Je n'utiliserais pas une "exception" dans sa définition littérale. Ce que vous pouvez choisir est de capturer l'annulation comme une valeur pilotée par l'utilisateur, un booléen peut-être, qui indique qu'un utilisateur a annulé une action, et utilise ce booléen pour ne pas effectuer les vérifications de condition d'erreur exhaustives.

2

Les exceptions sont plus efficaces pour les conditions rares nécessitant une manipulation non locale. Cela ressemble à ça s'applique ici. C'est donc une question purement stylistique. Le transfert de contrôle non-local peut être plus difficile à penser, mais cela signifiera probablement aussi un code plus court. Je fonderais la décision en fonction de la langue utilisée et de la quantité de code existante déjà conçue avec des exceptions. Si vous avez déjà un code de nettoyage d'exception, allez-y et utilisez-les.

0

dépend de la langue que vous utilisez. en php par exemple c'est une pratique courante de lancer une exception et de l'intercepter pour interrompre par exemple une boucle ou une récursion qui est appelée dans un objet où elle n'est pas suffisante pour sauter directement à la fonction parente. considérer cet exemple:

<?php 
class hideAndSeekWithOnlyOneOtherPlayer { 
    public function seek() { 
     foreach($rooms as $room) { 
      if($this->checkRoom($room)) { 
       $this->shoutThatIFoundYou(); 
       return; 
      } 
     } 
     $this->shoutThatICantFindYou(); 
    } 
    function checkRoom($room) { 
     $hideouts = $this->getPossibleHideoutsForRoom($room); 
     return $this->checkHideouts($hideouts); 
    } 
    function checkHideouts($hideouts) { 
     foreach($hideouts as $hideout) { 
      return $this->checkHideout($hideout); 

     } 
     return false; 
    } 
    function checkHideout($hideout) { 
     $this->walkToHideout(); 
     return $this->seeIfPersonIsInsideHideout(); 
    } 
} 
?> 

son gênant pour toujours passer la valeur booléenne d'une fonction à une autre, au contraire, vous pouvez simplement jeter un excemption dans seeIfPersonIsInsideHideout() et ne pas prise en charge des valeurs de retour du tout! maby c'est un mauvais exemple parce qu'il devient vraiment important quand vous avez plusieurs cas qui peuvent occour. alors vous devez reculer une constante ou une chaîne ou un entier que vous vérifiez dans une instruction case c'est bien mieux (plus facile à coder et à tester, moins de potentiel d'erreur) pour définir votre propre classe d'exception!