2009-12-08 10 views
0

J'importe plusieurs champs, c'est-à-dire environ 25 lignes de code chacune important un champ (dans mon cas, il n'y a vraiment pas d'autre moyen). C'est dans un bloc try-catch, mais il y a des fois, ce champ n'existe pas dans la source, mais je dois faire le reste.Une exception dans un bloc TRY interrompt-elle son exécution?

de 20.
Je reçois 10
le 11 on n'existe pas (exception) je besoin de 12 à 20.

Dans le cas où je ne veux pas tester l'existence d'un par un, je voudrais savoir comment fonctionne l'essai. en cas d'exception, il n'exécute pas le reste, n'est-ce pas? qu'est-ce qui pourrait me convenir?

obs: c'est beaucoup plus que 20, je veux une solution intelligente et non-poluting pour cela.

+1

Montrez du code. Cela nous aidera. –

+1

Quelle langue - .NET? Java? Autre? –

+0

des informations sur quelle langue est utilisée? – KevinDTimm

Répondre

3

Si une exception se produit dans un bloc try, rien après l'exception ne sera exécuté. Donc, si l'exception se produit sur l'élément 11, les éléments 12 à 20 ne seront pas exécutés. L'exécution passera de l'élément 11 au bloc catch, puis au bloc finally s'il y a un bloc finally. D'après ce que votre question a dit, vous obtenez l'exception quand un champ n'existe pas. Je recommande de vérifier si le champ existe, puis de faire l'opération. Je ne recommande pas d'utiliser une prise d'essai comme un moyen de vérifier une condition d'existence. Essayez les captures devraient être pour la gestion des erreurs, et si vous obtenez une erreur, vous ne voulez normalement pas continuer l'exécution normale. Si vous ne voulez pas l'idée de vérifier l'état de chaque ligne, ou il n'y a pas d'autre moyen de le vérifier autre que d'attraper une exception, alors je suggère faire une fonction d'aide à la prise d'essai dans ce

boolean checkField(field){ 
    try{/* do operation on field*/} 
    catch(Exception e){return false;} 
    return true; 
} 

void main(){ 
    if !(checkField(field1)) return; 
    else if !(checkField(field2)) return; 
    . 
    . 
    . 
} 
+0

Je n'avais pas pensé à ça, de cette façon je ferais un changement mineur dans chaque domaine et écrirais une fonction .. c'est sage, propre .. merci! va encore attendre pour voir si quelque chose d'encore mieux sortira – Marcelo

+1

C'est ce que stackoverflow est à propos, et habituellement quelque chose de mieux se présente, c'est pourquoi je reviens toujours! – Zoidberg

+0

Merci l'homme! J'ai utilisé le vôtre, fait une fonction qui vérifie si aucune exception ne se produit et renvoie la valeur. puis changé chaque ligne avec trois simples (soigneusement écrit) remplacer tous. en cinq minutes, je l'ai appliqué dans 115 champs (je n'étais pas sûr de combien ils étaient ... la fonction tout remplacer vous indique combien de changements il a fait. vraiment merci! – Marcelo

1

est ici try-catch-finally

Je encore recommanderai de vérifier vient l'existance du champ. C'est plus propre et plus correct.

+0

J'ai plus de 80 champs organisés par catégorie et extrêmement lisible. en vérifiant l'existence une par une, il faudrait (littéralement) tripler cette partie du code et la rendre tout à fait illisible (j'utilise vb.net) – Marcelo

+0

Vous pouvez utiliser une fonction pour vérifier et assigner les valeurs. Et si le code semble si répétitif, cela ne devrait-il pas être possible en boucle? –

1

Les exceptions dans une boucle seront un lot plus lent que de vérifier la validité.

3

Oui, une exception brise le bloc try - c'est le moyen de les gérer.
Si vous voulez continuer, vous devez essayer/attraper pour chaque champ. Cela ne veut pas dire l'écrire 20 fois, loin de là, refactoriser votre code:

  • Ajoutez une fonction qui récupère le champ (sous forme de chaîne?) Et tente de renvoyer une valeur.
  • Créez une nouvelle classe et définissez chaque champ comme un objet. Ne pas jeter une exeption du tout - si c'est un scénario commun, ne pas jeter une exception! Ajoutez une vérification avant de lire la valeur. Encore une fois, déplacer ceci à une fonction aidera.
+0

+1 pour l'astuce "Cela ne signifie pas l'écrire 20 fois, loin de là, refactoriser votre code". – Kane

+0

ouais, je suppose que je ne recevais pas quand vous avez dit "faire quelque chose pour chaque domaine". Je suis nouveau à la programmation que vous avez déjà remarqué. désolé =) – Marcelo

0

Lorsqu'une exception se produit à l'intérieur d'un bloc try, il va sauter dans le bloc catch (s'il n'y a pas de bloc catch, il va sauter dans le bloc finally et l'exception sera lancée. essayez bloc après l'erreur ne sera pas exécutée

soit:.
1) Vérifiez l'existence du champ avant chaque tentative
2) envelopper chaque importation de champ individuel dans son propre essai ...catch

J'irais pour 1), empêcher les exceptions qui se produisent en premier lieu.

Si vous refactorisez/divisez le code pour vérifier l'existence d'un champ dans une méthode réutilisable séparée, ce n'est pas vraiment un effort.