8
votes

Est enfin bloquer en C # un doit?

Quelle est la différence entre 2 conditions? Chaque fois que la méthode1 ou la méthode2 est exécutée, un bloc de code doit être exécuté. Il me semble que 2 méthodes sont identiques.

// example method1
void Method1(void)
{
    try
    {
        // do something
    }
    catch (Exception ex)
    {
        // do something
    }
    finally
    {
        // do something whenever method1 runs
    }
}

// example method2
void Method2(void)
{
    try
    {
        // do something
    }
    catch (Exception ex)
    {
        // do something
    }

    // do something whenever method2 runs
}


7 commentaires

Vous devez être concret sur le faire quelque chose s pour en faire une question.


dépend de ce que "faire quelque chose" fait


Veuillez lire ce qui suit pour plus d'informations. Enfin est facultatif où vous pourriez libérer des ressources après la fin du traitement. msdn.microsoft.com/en-us/Library /fk6t46tz(v=vs.71).aspx


Votre exception dans la méthode2 signifierait que vous ne serez peut-être jamais à la fin de la méthode. Dans la méthode 1 enfin sera toujours exécuté. Pas posté comme une réponse parce que je laisserai quelqu'un d'autre à donner des exemples, etc.


Non, ils ne sont pas les mêmes. Un bloc enfin garantit que le code qu'il contient fonctionne, peu importe ce qui se produit.


Ne pas attraper ce que vous ne pouvez pas gérer


Question vb.net, mais à peu près la même chose: Stackoverflow.com/Questions/11586667/...


7 Réponses :


2
votes

Le code dans le bloc enfin fonctionne de toute façon après la prise try, elle est très utile pour le nettoyage.

try
{
    // open resources
}
catch (Exception ex)
{
    // something bad happened
}
finally
{
    // close resources that are still opened
}


0 commentaires

17
votes

Dans votre premier exemple, vous pouvez ré-jeter l'exception et le code à l'intérieur de l'exécution finalement. Cela ne serait pas possible dans le deuxième exemple.

Si vous choisissez de ne pas ré-jeter l'exception, alors oui il y a peu de différence. Cependant, ceci est considéré comme mauvais formulaire - très rarement si vous devez consommer une exception que vous ne pouvez pas manipuler explicitement < /EM>.


est un mot clé pour vous aider avec le flux d'exécution du code. Lorsque vous lancez une exception, le flux d'exécution du code est affecté (comme à l'aide de retour ), le mot clé enfin vous permet d'exprimer que lorsqu'une exception se produit (ou que vous Retour à partir d'un Essayez ) Vous voulez toujours que l'exécution fasse quelque chose au fur et à mesure de son départ.

Pour répondre à la question face à face, c'est un must quand vous en avez besoin et Pas quand tu ne le fais pas.


lecture supplémentaire

Pour être du côté sûr, avant de tenter de commencer à utiliser ce mot clé, veuillez lire la documentation pour cela:

http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

et la manipulation des exceptions Mots-clés en général:

http: //msdn.microsoft.com/en-us/library/s7fekhdy.aspx


exemples

attrape une exception pour faire quelque chose avec elle, puis le jeter. Utilisez enfin pour appeler tout code de rangement: xxx

n'inscrivez aucun intérêt pour accrocher des exceptions, mais utilisez enfin pour ranger le code: xxx

retour de votre Essayez car il a l'air bien formaté, mais utilisez toujours enfin Pour garder le code de rangement: xxx


5 commentaires

Eh bien, oui et non. J'ai une tonne de captures (scénarios de réthrow dans les classes de base - qui appellent une interface de journalisation pour écrire l'exception au journal de l'application. Même si elles sont traitées plus loin, je veux connaître des trucs comme des exceptions de base de données tout le temps.


@Tomtom ils ne sont pas consommés, ils sont observés puis propagés. Par consommé, je veux dire avalé de ne plus jamais être vue.


@Adamhouldsworthorth Il est clairement conscient de ce qui ne comprend enfin que cela ne comprend pas pourquoi il en aurait besoin. Je pense que cela l'aiderait. Bien plus que "lire la spécification".


@AdamHouldsworthorth Désolé d'avoir suggéré comment vous pourriez améliorer votre réponse. J'essaie d'aider les gens. Je vois que vous avez supprimé le commentaire en question. Désolé je ne voulais pas toucher un nerf.


Laissez-nous Continuer cette discussion en chat



1
votes

Cela se comportera très différemment selon que vous retour à partir du essayez , par exemple. Aussi - le enfin fonctionnera même si le Catch jette une exception (ou relève l'exception originale), qui ne se produira pas sans le enfin .

Donc: ce n'est pas requis , mais cela se comportera différemment. Donc, si vous voulez que le code se produise, mettez-le dans le enfin .

à bien des égards, Essayez / enfin est beaucoup plus courant que Essayez / attrape ou ou Essayez / attrape / enfin .


0 commentaires

0
votes

Le bloc enfin garantit que tout code à l'intérieur toujours est exécuté, donc si vous avez une déclaration de retour à l'intérieur de votre bloc d'essai ou réthrow une exception dans votre bloc de capture, le code à l'intérieur du bloc enfin sera toujours Exécuter.

Il est indispensable si vous devez vous assurer que quelque chose se passe indépendamment (par exemple, disposer d'une ressource, etc.)


0 commentaires

0
votes

La grande différence est que tenter ... Catch dirigera l'exception, caché le fait qu'une erreur s'est produite. Essayez [Finalement exécutera votre code de nettoyage, puis l'exception va continuer, pour être gérée par quelque chose qui sait quoi faire avec elle.


0 commentaires

1
votes

Vous n'avez absolument pas besoin d'avoir le bloc enfin , cependant, il vous garantit que le code de son utilisation sera toujours exécuté (sauf si il y a une exception dans le enfin!).

Considérons Les éléments suivants: xxx

le code après le try / attrape n'exécutera pas si une exception est lancée. De plus, si le code dans le bloc est une erreur qui provoque une exception (telle que votre journalisation, lancez une exception inattendue), le code qui devrait avoir été dans le enfin sera ne pas exécuter, laisser et nettoyer et nettoyer.

Aussi une instruction de retour provoquera que le code ne soit pas exécuté, tandis que le final sera toujours exécuté (aussi, ici, vous pouvez voir que La capture peut être ignorée aussi, permettant à toutes les exceptions de propoger vers le haut - après avoir exécuté le enfin ): xxx

Chaque fois que vous avez le code de nettoyage qui doit être un code de nettoyage qui doit être exécuter à la fin d'une méthode, utilisez enfin (ou si vos objets impliquent Idisposable utilisent le à l'aide de instruction).


0 commentaires

3
votes

Comme vous savez que le code écrit à l'intérieur du bloc enfin fonctionne toujours. Veuillez consulter le point suivant écrit ci-dessous, il effacera votre toute confusion.

  1. est enfin utilisé pour Gestion des ressources. Principalement pour libérer une ressource . Il fonctionne toujours indépendant à l'exception.
    1. Comme nous savons que la capture est utilisé pour gérer une exception, mais parfois il ne manque pas à une exception externe . alors le bloc enfin est utilisé pour gérer cette exception pour effectuer l'opération.

0 commentaires