10
votes

Utiliser et essayer / attraper la nidification

Cette question est plus une question de savoir quelle est la bonne façon de faire quelque chose ...

La question ... Y a-t-il un ordre de nidification approprié entre un en utilisant code> bloc et un Essayez / attraper code>? p>

est-il ok pour nier l'ensemble de l'ensemble à l'aide de code> instruction à l'intérieur d'un essayer / attraper code> et maintenir les avantages d'un en utilisant le bloc code>? (Ou une exception entraînera une exception la partie de fermeture de l'instruction utilisant l'utilisation de la fenêtre) p>

ou si vous nichez le essayer / attraper code> à l'intérieur du en utilisant Code> Les déclarations et entourent uniquement les affirmations qui accédent à la base de données? p>

est ... p> xxx pré>

moins / plus correct que ... P >

using( tsmtcowebEntities db = new tsmtcowebEntities() ) {
     try {
          violationList = ( from a in db.DriverTrafficViolationDetails
                            where a.DriverTrafficViolation.DriverApplicationId == DriverAppId
                            orderby a.DateOfOccurance descending
                            select a ).ToList<DriverTrafficViolationDetail>();
          GeneralViolation = ( from a in db.DriverTrafficViolations
                               where a.DriverApplicationId == DriverAppId
                               select a ).FirstOrDefault();
     } catch { }
}


5 commentaires

Avez-vous vraiment besoin de tous les détails de votre application dans le code fourni? Je pense qu'un exemple de maquillage simple suffirait.


Le bloc de capture vide est une pratique de programmation extrêmement mauvaise. Ne le faites pas! Vous le regretterez plus tard.


@Jonathonreinhart, il était plus simple pour moi de copier et collez un bloc de code que de composer un exemple. Je suppose que le code quand je pense que mettre le code là-bas pour que le monde puisse être mauvais. Dans ce cas, je ne vois pas de négatifs alors pourquoi pas?


@phoog La plupart des endroits dans mon code, je pose le bloc de capture d'une impression d'entité, mais j'utilise aussi Elmah pour vous connecter à toutes mes exceptions, donc je suis informé de toutes les exceptions quelle que soit la façon dont je remplis le bloc de capture. Cela peut ne pas être la bonne façon de le faire, mais cela fonctionne pour moi pour le moment et si j'ai besoin de plus de détails supplémentaires que exception ne fournissent pas que j'entre et l'ajoutez. Sur ma liste de choses à faire, c'est beaucoup de ré-adapter du code, mais ils veulent le projet dès que possible, donc je dois couper des coins où je peux et noter où j'ai besoin de revenir en arrière et de réparer les choses une fois qu'il est là-bas.


@Jaré, de plus que tout le monde ait à lire, quand il n'est pas pertinent.


4 Réponses :


0
votes

Je suggérerais de placer l'essai / attraper dans l'utilisation car, que, quelles que soient une exception ou non, vous devez disposer de types le conteneur d'entité jetable


7 commentaires

Je suppose que cela faisait partie de ma question. J'étais 100% positif dans la fonctionnalité de la nidification de l'essai / attraper à l'intérieur de l'utilisation. J'étais plus sûr si une déclaration utilisée pouvait gérer l'inverse et je dispose toujours de l'objet / des ressources ... J'ai du code que je travaille sur et c'est actuellement à la fois. J'essaie de savoir si j'ai besoin de passer par le code et de vous assurer que l'essai / capture est toujours imbriqué ou non. Vous avez confirmé ce que j'attendais à l'origine, je vais donc accepter la réponse! @Glennferrielive


en utilisant fait son propre essai. Le Dispose sera toujours appelé.


-1 Dispose sera appelé quel que soit la nidification. @Jaré: L'utilisation est compilée à un essai-enfin (pas d'essais comme J.n. dit). Disposer est appelé dans le bloc enfin, il est donc appelé si l'exception est ou non prise ou manipulée.


Hwy - Guy qui m'a donné le (-1) ... Pensez-vous que l'essai attraper devrait encapsuler l'utilisation du bloc? Quel @phoog?


J'ai donné -1 parce que votre réponse implique que si l'utilisation est placée dans la prise try, et une exception est lancée, qui disposent de ne pas être appelée. Cette implication est incorrecte.


Cela ne répond pas à ma question ... @Phoog


@Glennferrielive quelle question? Est-ce que je pense que l'essai attraper devrait encapsuler l'utilisation du bloc? Pas particulièrement, mais en général, il y a des cas où quelqu'un pourrait vouloir enfermer un bloc d'utilisation dans un bloc d'essai.



2
votes

C'est vraiment une question de style et à quel point vous souhaitez limiter la portée de dB :

Si l'utilisation est à l'intérieur du bloc Essayer / Catch, la variable db ne sera accessible que dans la partie try.

Si l'utilisation est en dehors du bloc ESSAY / CATTER, il sera visible dans la partie capture.

Quoi qu'il en soit, la variable sera éliminée correctement car l'utilisation de bloc est l'équivalent d'un essai / enfin.

Personnellement, je me demanderais pourquoi vous devez prendre des exceptions du tout et quoi, si quelque chose, vous êtes capable de les faire avec eux.


1 commentaires

J'utilise fréquemment l'essai / capture pour définir un code d'état pour la réponse sur mes actions appelées par Ajax.



5
votes

Le plus tard est meilleur: il évitera de masquer des exceptions éventuellement lancées DY Dispose . Voir cette article.


2 commentaires

+1 pour le pointant sur cette sortie: toutefois, tout dispositif qui jette une exception est déjà "mauvais" dans mon livre :(


Sauf si vous voulez explicitement attraper des erreurs projetées par l'utilisation de l'utilisation. Quelque chose comme en utilisant (filtream fs = nouveau filtream (... peut jeter facilement si le chemin est invalide ou inaccessible, et peut même être plus susceptible de lancer que le contenu de votre utilisation de votre utilisation.



1
votes

en utilisant nids de manière prévisible avec ESSAY / CATCH et Dispose sera appelé tout sur les chemins. Signifie prévisible le contrôle toujours flux des étendues interne-> extérieures (pour les exceptions et le retour de flux normal).

La question est alors: quand si le saisir être exécuté en relation avec le Dispose et ce que devrait La portée des attrape est? La réponse à cela variera par le code mais doit évidemment être "à l'intérieur" si l'accès à dB est requis et "à l'extérieur" si le code exécuté dans le cadre de le en utilisant * pourrait être la source de l'exception.

(aussi, les blocs de capture vides sont Icky! Je suppose qu'ils sont là "à des fins de démonstration".)

codage heureux.


* Notez qu'une capture extérieure attrapera des exceptions projetées à partir de NOUVELLES TSMTCowebentities () ou (comme indiqué par J.N.) Le Dispose , doit-il exister. (C'est un autre sujet entièrement s'il est acceptable pour la construction de la construction d'une exception ;-) Je préfère attraper des exceptions aussi proches de la source que possible et laisser des exceptions que je ne sais pas comment traiter "saignement" non décourgés > sauf dans certaines constructions de niveau supérieur (par exemple, des gestionnaires d'événements).


1 commentaires

Je les ai en fait quelques endroits dans mon code simplement parce que j'ai elmah fixé pour attirer une exception. Sur ma liste de TODO, consiste à reprendre et à reporter beaucoup de code et que mes blocs Essayer / Catch sont l'un de ces domaines et améliorer la configuration de la journalisation des erreurs que j'ai.