Comment gérer efficacement un Flux avec un try / catch / finally C#

J'ai récemment discuté avec un collègue qui m'a dit que j'étais la gestion incorrently d'un flux dans un try /catch /bloc. Donc, je veux savoir ce qui serait une bonne approche pour vous.

            try
            {
                StreamReader sr = new StreamReader("TestFile.txt");
                //After that, here an operation of about 30 seconds to fulfill;
            }
            catch (IOException ioex)
            {
                throw new IOException("An error occurred while processing the file.", ioex);
            }
            catch (Exception ex)
            {
                throw new Exception("An generic error ocurred.");
            }
            finally
            {
                if(sr != null){
                    stream.Close();
                    stream = null;
                }
            }

Il a déclaré que le fait d'avoir 2 Exception sont inutiles, voire même à l'aide de la IOException. Nous pouvons utiliser seule Exception. Mais la seule chose que je veux, c'est de reconnaître exactement où l'exception a été produite, parce que, après l'ouverture du fichier, une opération de l'ordre de 30 secondes sera effectuée.

De sorte que penseriez-vous? Nous avons vu ce MS exemple (http://msdn.microsoft.com/fr-Fr/library/system.io.streamreader.aspx) qui c'est plus simple, mais en termes de performance ou de nettoyer le code, vous trouvez quelque chose d'étrange?

Votre avis s'il vous plaît!

-MODIFIER-----------------

Ok, je vois le point, mais nous avons discuté à propos de la prise IOException et seulement à l'aide de l'Exception. À mon avis, comme dans l'exemple ci-dessus, vous pouvez savoir où l'erreur a eu lieu; au moment de gérer le dossier ou dans le processus après l'ouverture du fichier. C'est ma première question. Et maintenant, que pensez-vous de ce changement ci-dessous.

            try
            {
                using(StreamReader sr = new StreamReader("TestFile.txt"))
                {
                //After that, here an operation of about 30 seconds to fulfill;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("An generic error ocurred.");
            }
            finally
            {
                if(sr != null){
                    stream.Close();
                    stream = null;
                }
            }

-------------------MODIFIER 2------------------------

Enfin, j'espère que ce serait ma dernière solution. Merci beaucoup pour vos réponses. SI l'aide est plus rapide, efficace et juste une exception près qu'il est nécessaire.

            try
            {
                using (StreamReader stream = sr = new StreamReader("TestFile.txt"))
                {
                    //Operation
                }
            }
            catch (Exception e)
            {
                throw new Exception(String.Format("An error ocurred while executing the data import: {0}", e.Message), e);
            }

Si tout autre commentaire serait apprécié!

que c'est plus simple, mais en termes de performances Le using mot-clé est 100x plus rapide que la finally mot-clé.
Merci pour votre réponse. Voir mon EDIT de la section s'il vous plaît.
Vous n'êtes pas en mesure d'accéder à sr dans votre finally bloc.
euh, 100x plus rapidement, c'est tout simplement pas vrai.
Je suis conscient de cela.

OriginalL'auteur Maximus Decimus | 2013-10-31