2010-06-23 13 views
0

J'utilise toujours une prise d'essai quand je traite des opérations liées à la base de données pour, par exemple.Les insertions, mises à jour et suppressions de base de données doivent-elles être encapsulées dans try/catch?

try 
{ 
DataContext.AddtoObjectname(obj); 
DataContext.SaveChanges(); 
} 
catch(Exception e) 
{ 
throw new Exception("Problems adding object" + e); 
} 

Mais je lis try/catch affectant la performance ici -
Do try/catch blocks hurt performance when exceptions are not thrown?
dois-je ajouter donc attraper essayer quelque chose que je fais ci-dessus ou devrais-je opter otherwise.Thanks pour votre aide.

+0

Oui, sinon comment diriez-vous au client de l'état de cette opération. –

+1

Comment attraper toutes les exceptions et en lancer une nouvelle aide? –

Répondre

4

Les instructions Try/Catch elles-mêmes n'affectent pas de manière significative les performances, mais le lancement et l'interception de nombreuses exceptions peuvent en être affectés.

En général, vous voulez vous assurer que vous n'obtenez que des exceptions pertinentes - sinon vous risquez de masquer un bogue dans votre application. Dans ce cas, DataException ou UpdateException sont probablement de bons candidats car ce sont les exceptions qui seront levées si quelque chose ne va pas dans SaveChanges.

Il semble que vous attrapiez l'exception pour y ajouter vos propres informations supplémentaires. Dans ce cas, il est toujours préférable de conserver l'exception d'origine en tant qu'exception interne.

throw new Exception("Problems adding object" + e, e); 

Je vous conseille également de créer votre propre type d'exception spécifique à cette application.

+1

Vous ne devriez jamais lancer «Exception». FxCop bloque cela, et pour de bonnes raisons. –

1

Cela dépend. Si vous avez uniquement l'intention de relancer l'exception, il est inutile de l'avoir dans une tentative d'attraper. Vous ajoutez du code sans fournir de valeur réelle. Si vous voulez faire quelque chose avec l'exception, enregistrez-le, vérifiez un type spécifique, etc., c'est différent, parce que vous avez l'intention d'agir sur le comportement inattendu.

Mais je lis try/catch affectant la performance ..

capture Essayez n'est pas vraiment ce qui affecte la performance, la création de l'exception qui est l'opération "coûteux". Vraiment dans le grand champ des choses ce n'est pas si mal, et vous ne devriez pas éviter les exceptions à cause de la "dépense". Sur une note connexe, si vous essayez d'attraper, sauf si vous ne devez pas créer une nouvelle exception si vous pouvez l'éviter. Rejeter juste la vieille exception.

2
  • Attrapez uniquement ce que vous pouvez gérer. Si vous ne pouvez pas gérer l'erreur et récupérer gracieusement, laissez l'exception grimper jusqu'à un niveau supérieur qui peut le gérer. Si vous voulez enregistrer l'exception là où cela arrive (raisonnable), connectez-la et relancez la même exception si vous ne pouvez pas récupérer.

  • En règle générale, n'attrapez jamais une exception générique. Au lieu de cela, spécifiez explicitement les exceptions: catch (SQLException e) au lieu de catch (Exception e)

  • Si vous lancez une exception à partir d'un bloc catch, veillez à placer l'exception interceptée dans l'exception interne du nouveau. Ne pas jeter un Exception, être plus spécifique. Si le framework n'a pas déjà d'exception pour ce dont vous avez besoin, créez-en un.

0

Oui c'est ce que try/catch for. Perdre le contrôle et avoir le risque d'amener votre base de données à un état incohérent coûte plus cher que d'essayer/attraper les frais généraux. S'il y a une exception, il n'y a pas de façon "bon marché" de traiter de manière générale ....