Question

J'essaie de plus en plus d'exploiter le bloc using ces jours-ci lorsque j'ai un objet qui implémente IDisposable mais une chose que je n'ai pas comprise est comment intercepter une exception comme je le ferais dans un try/catch/finally normal...des exemples de code pour m'orienter dans la bonne direction ?

Modifier:La question a été modifiée après lecture des réponses.C'était "comment lancer une exception dans un bloc d'utilisation avec .net 2.0?" Mais je cherchais en fait un moyen d'attraper ces exceptions à l'intérieur d'un bloc d'utilisation.


Je cherche plus de détails sur le fait de faire rouler mon propre bloc de capture à l'intérieur d'un bloc d'utilisation.

Modifier:Ce que je voulais éviter, c'est de devoir utiliser un try/catch/finally dans mon bloc using comme l'a montré @Blair.Mais peut-être que ce n'est pas un problème...

Modifier:@Blair, c'est exactement ce que je cherchais, merci pour la réponse détaillée !

Était-ce utile?

La solution

Je ne comprends pas vraiment la question - vous lancez une exception comme vous le feriez normalement.Si MyThing met en oeuvre IDisposable, alors:

using ( MyThing thing = new MyThing() )
{
    ...
    throw new ApplicationException("oops");
}

Et thing.Dispose sera appelé lorsque vous quittez le bloc, car l'exception est levée.Si vous souhaitez combiner un try/catch/finally et un using, vous pouvez soit les imbriquer :

try
{
    ...
    using ( MyThing thing = new MyThing() )
    {
        ...
    }
    ...
}
catch ( Exception e )
{
    ....
}
finally
{
    ....
}    

(Ou mettez le try/catch/finally dans using) :

using ( MyThing thing = new MyThing() )
{
    ...
    try
    {
        ...
    }
    catch ( Exception e )
    {
        ....
    }
    finally
    {
        ....
    }    
    ...
} // thing.Dispose is called now

Ou vous pouvez dérouler le using et appelle explicitement Dispose dans le finally bloquer comme @Quarrelsome l'a démontré, en ajoutant tout code supplémentaire de gestion des exceptions ou de récupération dont vous avez besoin dans le finally (ou dans le catch).

MODIFIER:En réponse à @Toran Billups, si vous devez traiter des exceptions en plus de vous assurer que votre Dispose méthode est appelée, vous devrez soit utiliser un using et try/catch/finally ou déroulez le using - Je ne pense pas qu'il existe d'autre moyen d'accomplir ce que tu veux.

Autres conseils

Oui, il n'y a rien de différent dans le fait de lancer des exceptions lors de l'utilisation de blocs.N'oubliez pas que le bloc using se traduit essentiellement par :

IDisposable disposable = null;
try
{
    disposable = new WhateverYouWantedToMake();
}
finally
{
    disposable.Dispose()
}

Vous devrez donc lancer votre propre capture si vous voulez attraper quelque chose, mais attraper/lancer est une préoccupation complètement distincte de l'utilisation.L'exécution de l'final est presque garantie (sauf une exception incapable (par ex.stackoverflow ou manque de mémoire) ou quelqu'un coupant l'alimentation du PC).

Vous devez avoir une instruction try pour intercepter une exception

Soit vous pouvez utiliser une instruction try dans le bloc using, soit vous pouvez utiliser un bloc using dans un bloc try

Mais vous devez utiliser un bloc try pour détecter toutes les exceptions qui se produisent

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top