2010-04-24 3 views
-1

Je crée une méthode d'extension en C# pour extraire une valeur de datagridview. Ici, si un utilisateur donne un nom de colonne qui n'existe pas, alors je veux que cette fonction lance une exception qui peut être gérée à l'endroit où cette fonction sera appelée. Comment puis-je y parvenir.Comment créer un gestionnaire d'exceptions personnalisé pour des contrôles personnalisés ou des méthodes d'extension

public static T Value<T>(this DataGridView dgv, int RowNo, string ColName) 
    { 
      if (!dgv.Columns.Contains(ColName)) 
       throw new ArgumentException("Column Name " + ColName + " doesnot exists in DataGridView."); 
      return (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T)); 
    } 

Répondre

1

est difficile de comprendre votre question, mais il semble que vous êtes désireux de lancer une exception et la poignée où vous appelez votre méthode d'extension. Si oui, vous êtes presque là. Vous lancez déjà l'exception, il suffit de mettre un bloc try/catch autour du callsite.

public static T Value<T>(this DataGridView dgv, int RowNo, string ColName) 
{ 
    if (!dgv.Columns.Contains(ColName)) 
     throw new ArgumentException("Column Name " + ColName + " doesnot exists in DataGridView."); 
    return (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T)); 
} 

// Wherever you call the method: 
try 
{ 
    dataGridView.Value(rowNumber, columnName); 
} 
catch (ArgumentException) 
{ 
    // caught the exception 
} 

Est-ce ce que vous cherchez?

+0

@Zach: vous avez compris ce que je voulais dire. Mais je suis un peu confus ici. Supposons que je crée un assembly pour cela et l'inclue ensuite dans un autre projet. Je n'utilise pas de gestionnaire d'exception sur leur cas où l'exception se produira-t-elle? Je veux dire dans ma DLL ou mon code d'utilisateur. Je me sens comme si ma DLL va raccrocher sur ce point. Et l'utilisateur utilisant dll va les piéger et toute son application se fermera de façon anormale. Est-ce vrai? –

+1

@Shantanu: Tant que vous créez vos classes d'exception personnalisées 'public', votre autre projet sera capable d'intercepter les exceptions personnalisées que vous lancez. Si ce n'est pas le cas, l'autre projet va planter (à moins qu'il n'attrape toutes les exceptions, mais cela est considéré comme une mauvaise pratique). –

2

Ce n'est pas la bonne façon de procéder. Tout d'abord, il n'y a rien d'exceptionnel à propos d'un utilisateur qui a mal saisi quelque chose. Deuxièmement, cette méthode d'extension est susceptible d'être appelée profondément imbriquée dans un type de code qui fonctionne avec, disons, la base de données. Vous avez pour attraper l'exception, car une erreur de frappe est normale. Mais vous avez maintenant aussi le fardeau d'écrire le gestionnaire d'exception et un tas de code qui restaure correctement l'état du programme.

La validation de la saisie par l'utilisateur devrait se faire tôt, avant de déclencher un train de code difficile à arrêter. Et il n'y a aucune raison d'utiliser des exceptions dans la validation des entrées utilisateur, une simple instruction if() fait le travail.

Vous pouvez maintenant laisser l'instruction throw en place, si vous le souhaitez, cela permet un meilleur diagnostic. Mais vous ne devriez jamais gérer cette exception car elle diagnostique maintenant un bug dans votre code. Et vous ne pouvez pas corriger les bogues avec des clauses catch.

0

Bien que la question ait déjà reçu une réponse, je proposerais simplement une deuxième solution. L'idée de lancer une exception devrait être la dernière option. Vous pouvez réaliser la même chose en utilisant l'approche ci-dessous. PS: je n'ai pas tapé ce code sur l'éditeur, alors s'il vous plaît excusez les fautes de frappe.

Questions connexes