Laquelle:
using (var myObject = new MyClass())
{
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
}
OU
try
{
using (var myObject = new MyClass())
{
// something here...
}
}
catch(Exception ex)
{
// Handle exception
}
c#
try-catch
using-statement
Xaqron
la source
la source
}
de lausing
déclaration peut jeter une exception comme l'a rappelé ici .finally
méthode implicite appelée la méthode dispose.Réponses:
Je préfère le second. Peut également piéger les erreurs liées à la création de l'objet.
la source
try
bloc, ce qui vous permet d'afficher un message d'erreur si quelque chose échoue, le programme a maintenant la capacité de récupérer et d'informer l'utilisateur.using( DBConnection conn = DBFactory.getConnection())
qui devrait être annulée en cas d'exception. Il me semble que les deux ont leur place.Étant donné qu'un bloc d'utilisation n'est qu'une simplification de la syntaxe d'un essai / enfin ( MSDN ), personnellement, j'irais avec ce qui suit, même si je doute que ce soit significativement différent de votre deuxième option:
la source
finally
bloc est préférable à l'using
instruction?finally
bloc qui supprime un objet IDisposable est ce qu'uneusing
instruction fait. Personnellement, j'aime ça au lieu duusing
bloc intégré parce que je pense qu'il indique plus proprement où tout se passe, et que tout est au même «niveau». J'aime aussi cela plus que plusieursusing
blocs intégrés ... mais c'est juste ma préférence.try
instruction pour être supprimé dans l'finally
instruction; sinon, il lancera une erreur du compilateur: "Utilisation de la variable locale non affectée 'myObject'"Cannot assign null to implicitly-typed local variable
;) Mais je sais ce que vous voulez dire et je préférerais personnellement cela à l'imbrication d'un bloc d'utilisation.Ça dépend. Si vous utilisez Windows Communication Foundation (WCF),
using(...) { try... }
ne fonctionnera pas correctement si le proxy dans l'using
instruction est à l'état d'exception, c'est-à-dire que la suppression de ce proxy provoquera une autre exception.Personnellement, je crois en une approche de manipulation minimale, c'est-à-dire ne gérez que l'exception dont vous avez connaissance au moment de l'exécution. En d'autres termes, si vous savez que l'initialisation d'une variable dans
using
peut lever une exception particulière, je l'enveloppe avectry-catch
. De même, siusing
quelque chose peut se produire dans le corps, qui n'est pas directement lié à la variable inusing
, alors je l'enveloppe avec un autretry
pour cette exception particulière. J'utilise rarementException
dans mescatch
es.Mais j'aime bien
IDisposable
etusing
donc je suis peut-être partial.la source
Si votre instruction catch a besoin d'accéder à la variable déclarée dans une instruction using, alors inside est votre seule option.
Si votre instruction catch a besoin de l'objet référencé dans using avant qu'il ne soit supprimé, alors inside est votre seule option.
Si votre instruction catch prend une action de durée inconnue, comme afficher un message à l'utilisateur, et que vous souhaitez disposer de vos ressources avant que cela ne se produise, alors l'extérieur est votre meilleure option.
Chaque fois que j'ai un scénario similaire à celui-ci, le bloc try-catch est généralement dans une méthode différente plus haut dans la pile d'appels de l'utilisation. Il n'est pas courant pour une méthode de savoir comment gérer les exceptions qui s'y produisent de cette manière.
Ma recommandation générale est donc à l'extérieur - bien à l'extérieur.
la source
Les deux sont une syntaxe valide. Cela dépend vraiment de ce que vous voulez faire: si vous voulez attraper des erreurs liées à la création / suppression de l'objet, utilisez le second. Sinon, utilisez le premier.
la source
Il y a une chose importante que j'appellerai ici: la première ne détectera aucune exception découlant de l'appel du
MyClass
constructeur.la source
À partir de C # 8.0, je préfère utiliser le second comme celui-ci
puis
la source
Si l'objet que vous initialisez dans le bloc Using () peut lever une exception, vous devriez opter pour la deuxième syntaxe sinon les deux sont également valides.
Dans mon scénario, je devais ouvrir un fichier et je passais filePath dans le constructeur de l'objet que j'étais en train d'initialiser dans le bloc Using () et cela pouvait lever une exception si le filePath est faux / vide. Donc, dans ce cas, la deuxième syntaxe a du sens.
Mon exemple de code: -
la source
À partir de C # 8.0 , vous pouvez simplifier les
using
instructions sous certaines conditions pour vous débarrasser du bloc imbriqué, puis cela s'applique uniquement au bloc englobant.Ainsi, vos deux exemples peuvent être réduits à:
Et:
Les deux sont assez clairs; et puis cela réduit le choix entre les deux à une question de ce que vous voulez que la portée de l'objet soit, où vous voulez gérer les erreurs d'instanciation, et quand vous voulez en disposer.
la source