Question

Que pensez-vous de code qui ressemble à ceci:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        throw;
    }
}

Le problème que je vois est l'erreur réelle n'est pas traitée, juste jeter l'exception dans un endroit différent. Je trouve qu'il est plus difficile à déboguer parce que je ne suis pas un numéro de ligne où le problème réel est.

Alors, ma question est pourquoi serait-ce bien?

---- EDIT ----

D'après les réponses, il semble que la plupart des gens disent qu'il est inutile de le faire sans exception personnalisés ou spécifiques capturés. Voilà ce que je voulais commentaires, quand aucune exception spécifique est pris. Je peux voir le point de faire quelque chose en fait une exception interceptée, mais pas la façon dont ce code est.

Était-ce utile?

La solution

En fonction de la qualité que vous regardez ce ne sont pas jeter l'exception dans un endroit différent. « Jeter » sans cible rethrows l'exception qui est très différent de lancer une exception. Principalement un rethrow ne réinitialise pas la trace de la pile.

Dans cet exemple particulier, la prise est inutile parce qu'il ne fait rien. L'exception est heureusement relancée et il est presque comme si le try / catch n'existait pas.

Autres conseils

Je pense que la construction devrait être utilisé pour traiter les exceptions que vous savez que vous allez jeter à l'intérieur de votre code; si autre exception est soulevée, puis juste réémettre.

Prendre en compte jeter; est différent jet ex;

jet ex tronque la pile au nouveau point de lancer, perdre de précieuses informations sur l'exception.

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (EspecificException ex)
    {
        HandleException(ex);
    }
    catch (Exception ex)
    {
        throw;
    }
}

Il ne serait pas, idéalement le bloc catch ferait une manipulation, puis réémettre, par exemple.

try
{
    //do something
}
catch (Exception ex)
{
    DoSomething(ex); //handle the exception
    throw;
}

Bien sûr, la re-jet sera utile si vous voulez faire une autre manipulation dans les étages supérieurs du code.

Faire quelque chose comme ça est assez vide de sens, et j'essaie en général de ne pas aller sur la route de faire les choses vides de sens;)

Pour la plupart, je crois en attrapant types d'exceptions que vous savez comment gérer, même si cela signifie que la création de votre propre exception avec plus d'informations et l'utilisation de l'exception pris comme InnerException.

Parfois, cela est approprié - quand vous allez gérer l'exception plus haut dans la pile d'appels. Cependant, vous aurez besoin de faire quelque chose dans ce bloc catch autre qu'un simple re-jet pour elle de donner un sens, par exemple enregistrer l'erreur:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        LogException (ex);  // Log error...
        throw;
    }
}

J'ai vu des cas où des exceptions génériques sont pris comme ça et puis re-emballé dans un objet sur mesure d'exception.

La différence entre cela et ce que vous dites est que ces objets personnalisés d'exception détiennent plus d'informations sur l'exception réelle qui est arrivé, pas moins.

Eh bien pour commencer, je voudrais simplement faire

catch
{
   throw;
}

mais, fondamentalement, si vous piégeage plusieurs types d'exceptions que vous pouvez gérer une partie localement et d'autres sauvegarder la pile.

par exemple.

catch(SQLException sex) //haha
{
   DoStuff(sex);
}
catch
{
   throw;
}

Cela dépend de ce que vous entendez par « ressemble à ceci », et s'il n'y a rien d'autre dans le bloc catch mais rethrow ... si tel est le cas la prise d'essai est inutile, sauf, comme vous le dites, à obscurcir où l'exception a eu lieu. Mais si vous avez besoin de faire quelque chose là où l'erreur est survenue, mais souhaitez gérer l'exception furthur la pile, cela pourrait être approprié. Mais alors, la pêche serait à l'exception spécifique que vous êtes Handl, ing, aucune exception

Je ne pense pas seulement rethrowing l'erreur serait utile. À moins que vous ne vous souciez pas vraiment l'erreur en premier lieu.

Je pense qu'il serait préférable de faire quelque chose dans la prise.

Vous pouvez consulter la Exception MSDN Guide de manipulation .

En général ayant des blocs de traitement d'exception qui ne fait rien est pas bon du tout, pour la simple raison qu'il empêche la machine virtuelle .Net de inline vos méthodes lorsque la performance optimisation de votre code.

Pour un article complet sur pourquoi voir « sortie n'est pas Debug: Optimisations 64bit et C # Méthode Inlining dans une version validée « par Stacks appel Scott Hanselman

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