2010-06-04 5 views
2

Je souhaite ignorer un type d'exception spécifique dans un groupe d'instructions; sans avoir à mettre vide Try..Catch es autour d'eux.Ignorer une exception typée spécifique

try{ o1.Update(); } catch (Exceptions.NoChangeMade ex) {} 
try{ o2.Update(); } catch (Exceptions.NoChangeMade ex) {} 
try{ o3.Update(); } catch (Exceptions.NoChangeMade ex) {} 

Je voudrais soit un moyen de type On Error Resume, ou d'une manière Continue dans les prises

+0

Vous pourriez envisager des alternatives à lancer une exception en l'absence de modification. (À moins que vous n'ayez le contrôle sur la méthode Update.) –

Répondre

3

Si vous voulez tous les mettre à jour, vous n'avez pas vraiment un choix sans emballage l'exception.

Vous pouvez faire quelque chose comme:

var list = List<objects_to_update>(); 

list.Add(o1); 
list.Add(o2); 
etc.  

list.ForEach(x=> 
    try{list.Update()} 
    catch{} 
); 

Vous aurez encore à les envelopper dans une exception, mais au moins de cette façon vous ne l'écrire une fois.

+0

La seule autre alternative est la gestion de l'exception dans 'Update'. –

+0

@Jeff, c'est vrai aussi. Je partais du principe qu'il ne pouvait pas modifier la mise à jour. – kemiller2002

+0

Je suis d'accord avec cette supposition ... si l'Exception est assez inutile pour être ignorée en toute sécurité, alors si l'OP a le contrôle sur Update, il ne devrait tout simplement pas l'envoyer du tout. – Joren

0

Si o1/o2/o3 sont tous de la même classe, placez 1 try dans la méthode .Update() pour intercepter l'exception spécifique que vous recherchez. Ou mieux encore, changez le code afin qu'il ne lève pas l'exception du tout.

4

Voici un moyen simple:

ExecuteIgnore(o1.Update); 
ExecuteIgnore(o2.Update); 
ExecuteIgnore(o3.Update); 
... 
private static void ExecuteIgnore(Action action) 
{ 
    try { action(); } 
    catch(Exceptions.NoChangeMade) { } 
} 

Vous pouvez le rendre encore plus générique (si un peu plus) comme ceci:

ExecuteIgnore<Exceptions.NoChangeMade>(o1.Update); 
ExecuteIgnore<Exceptions.NoChangeMade>(o2.Update); 
ExecuteIgnore<Exceptions.NoChangeMade>(o3.Update); 
... 
public static void ExecuteIgnore<T>(Action action) where T : Exception 
{ 
    try { action(); } 
    catch(T) { } 
} 
1

Est-ce o1, o2, objets o3 liés? Pourriez-vous les mettre dans une collection ou un tableau? Si vous faites cela, vous pouvez modifier votre code pour utiliser une boucle pour mettre à jour les éléments, puis vous pouvez faire en sorte que le bloc de capture vide passe le contrôle à la prochaine itération de la boucle.

Certains pseudo-code pour illustrer:

foreach(DataTypeOfO o in CollectionOfOs) 
{ 
    try 
    { 
      o.Update(); 
    } 
    catch(Exceptions.NoChangeMade ex)  
    { } 
} 
Questions connexes