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é!
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
Vous devez vous connecter pour publier un commentaire.
vous pouvez utiliser
using
bloc ci-dessous, et il va disposer le flux même sur une exception s'est produiteException de Catch, si vous allez faire quelque chose. Si vous ne pouvez pas résoudre le problème, il n'y a aucun point dans l'attraper.
si vous ne pouvez pas résoudre l'exception, il est préférable de laisser la bulle exception l'exception et de l'attraper.
Votre montage est mauvais, vous n'avez pas besoin d'utiliser le bloc finally comme le
using
déclaration fait ce travail pour vous.Ok. Je vais examiner cette possibilité. Ce qui concerne les exceptions. Il serait nécessaire de gérer les 2 bloc catch ou juste 1 serait il suffit (d'Exception).
pouvez-vous expliquer?
Vous voulez probablement
throw new Exception("A generic ...", ex)
.OriginalL'auteur Damith
Ne pas attraper une exception qu'à jeter de la même exception immédiatement, seulement maintenant, avec moins d'informations et manque le cadre de la pile d'où l'exception s'est effectivement produite.
Si je suis tombé sur quelque chose comme
dans une revue de code, je manquerais l'examen (et pas seulement de la grammaire et de l'orthographe, erreur que ce soit 😉
À tout le moins, vous devriez jeter à l'exception d'origine comme un intérieur d'exception.
Mais pour être tout à fait franc, dans cet exemple de code, il n'ajoute rien du tout, il serait mieux de les enlever de l'omi.
OriginalL'auteur Tim Jarvis
Si vous êtes renvoi de l'exception au lieu de l'attraper, pourquoi s'embêter à créer une nouvelle exception? Vous êtes de jeter des informations précieuses. Il n'y a littéralement pas de point d'en attraper une exception qu'à jeter de nouveau. Et il n'est point de remplacer un utile exception (comme dans, il a toutes les informations de diagnostic quelqu'un en amont pourriez avoir besoin) et de le remplacer par un générique exception.
Pour votre situation, je serais tout simplement:
tous vos autres améliorations sont tout le contraire.
OriginalL'auteur spender