2010-09-15 6 views
1

Je suis en train de raclée à travers toute la jungle gestion des exceptions, et je suis maintenant essayer de déterminer combien try/catch les blocs dont j'ai besoin, et où les mettre.ASP.NET MVC2 - nombre et l'emplacement try/catch (jeter?) Blocs

De mon contrôleur je

CreateInvitation(fromUser, toUser); 

qui appelle jusqu'à ma méthode de BLL

public static Invitation CreateInvitaton(User fromUser, User toUser) 
{ 
    try 
    {// see if toUser exists, then create the invitation} 
    catch 
    {// throw something, maybe?} 
} 

Ai-je vraiment besoin de re-jeter dans cette méthode? Ne reviendra-t-il pas dans la pile même si je ne la relance pas?

Ai-je besoin d'envelopper l'appel du contrôleur dans un bloc try/catch aussi, ou est-ce superflu?

Peut-être que je ne pas besoin du bloc try/catch dans la méthode BLL du tout, et seulement besoin d'un bloc try/catch dans mon contrôleur?

Je regarde assez peu combinaisons possibles ici, et ne savent pas ce que l'un est bon.

Merci.

Répondre

1

Catch exceptions localement si et seulement si elles indiquent un comportement exceptionnel et peut être fixé (ou commenté) localement.

assez difficile de trouver un exemple - en voici un: j'ai quelques objets qui ont besoin verrouillage pessimiste. Le verrouillage est nécessaire car l'écriture sur l'objet à partir de l'application Web pendant qu'une autre application (en arrière-plan) le lit risque d'entraîner un désastre. C'est vraiment une exception, car cela arrivera très rarement. De plus, je ne peux rien y faire à l'avance (car le verrou aurait pu être acquis juste avant l'exécution de la ligne suivante). Cependant, je peux réessayer dans quelques msecs, parce que je sais que les chances sont bonnes que l'objet soit libéré à nouveau. Pourtant, tout cela ne se produit pas dans le contrôleur, mais dans une classe de service.

Ne pas utiliser des exceptions pour les conditions attendues (entrée non valide, par exemple).

En outre, je suis d'accord que la plupart des exceptions dans les applications Web ne peuvent pas être traitées, sauf pour la journalisation d'un message (pas être fait dans les contrôleurs) et l'envoi d'une page d'erreur. Enfin, lors de la capture des exceptions, assurez-vous de le faire correctement (attraper un type d'exception spécifique, recopier avec throw; pas throw ex;)

+0

Ensuite, il n'y a aucune raison d'avoir même des blocs try/catch dans le contrôleur, hein? – asfsadf

2

Le gestionnaire d'exception, comme il est écrit dans votre exemple, ne fait absolument rien. (Bien, il gaspille un peu de temps, mais il ne fait rien d'utilisation)

Si elle avait été:

try 
{...} 
catch 
{ 
    // do something here. 
    throw; 
} 

Puis le try/catch & jet serait nécessaire.

+3

+1. Expansion sur ceci: n'utilisez pas try/catch sauf si vous avez besoin d'ajouter quelque chose de significatif au message d'exception. Dans 99% des cas, vous devriez permettre à l'exception d'atteindre votre page d'erreur par défaut et l'enregistrer avec quelque chose comme ELMAH. –

+0

Merci. J'utilisais simplement cette coquille comme un espace réservé pour indiquer où je songeais à le mettre. – asfsadf

+0

OK, alors abandonnez le bloc try/catch BLL et cherchez à détecter toute erreur dans mon contrôleur? – asfsadf