web-dev-qa-db-fra.com

Dresser une exception en try block

    try { 
        if (isFileDownloaded)
            //do stuff
        else
            throw new CustomException()
   } 
   catch (Exception e)
   {
       // something went wrong save error to log
   }
   finally
   {
       //release resources
   }

Ma question est la suivante: catch attrape le ApplicationException jeté dans le bloc d'essai? Est-ce dans un mauvais style de codage? Devrait-il être écrit d'une autre manière?

19
Quincy

Le catch va attraper votre exception (et tout autre qui se produit). Cela étant dit, j'essaie d'éviter d'écrire du code comme celui-ci lorsque cela est possible.

Personnellement, je vois peu de raisons de manipuler des exceptions (capture) pour une exception projetée dans la même portée. Si vous pouvez gérer votre erreur dans votre méthode - Mettez la manipulation d'exception (c.-à-d. Logging) directement dans le bloc d'essai.

L'utilisation d'un catch est plus utile, IMO, pour attraper des exceptions projetées par des méthodes dans votre numéro de votre try bloc. Cela serait plus utile, par exemple, si votre // do stuff La section a eu lieu à appeler une méthode qui a soulevé une exception.

En outre, je recommande de ne pas attraper toutes les exceptions (Exception e), mais plutôt les types spécifiques d'exceptions que vous pouvez gérer correctement. La seule exception à ce sujet serait si vous retirez l'exception dans votre capture - c'est-à-dire: l'utiliser à des fins de journalisation mais la laissez-la encore à bouillir la pile d'appel.

24
Reed Copsey

Oui, il attrapera ApplicationException tel qu'il dérive de Exception.

Manipulation de la base d'exception devrait être bien dans la plupart des cas sauf si vous n'avez besoin de vous connecter ou de faire quelque chose avec un type d'exception différent ...

try{
    if (isFileDownloaded)
       //do stuff
    else
       throw new ApplicationException();
}
catch(ApplicationException ae)
{
   // log it application exception here...
}

catch(Exception ex)
{
   // log all other exceptions here...
}
finally
{
   // release resources...
}
8
xandercoded

En outre, FYI, ApplicationException a été obsolète depuis .NET 2.0 comme exception à découler de. Il n'a jamais été conçu comme une exception à jeter seul, vous ne devriez probablement pas l'utiliser du tout.

2
John Saunders

Oui, la prise attraperait votre applicationException et oui est un style de codage médiocre. En tant que bonne règle générale, n'atteignez que des exceptions spécifiques et celles que vous allez faire quelque chose avec, comme la fixation de l'état d'application.

1
btlog