2010-04-24 76 views
-1

我正在C#中创建扩展方法以从datagridview中检索某个值。 这里如果用户给出的列名不存在,那么我想让这个函数抛出一个异常,这个异常可以在这个函数被调用的地方处理。 我怎样才能做到这一点。如何为自定义控件或扩展方法创建自定义异常处理程序

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)); 
    } 

回答

1

难以理解你的问题,但它听起来像是你想抛出一个异常,并在你称之为扩展方法的地方处理它。如果是这样,你几乎在那里。您已经抛出异常,只需在调用点周围放置一个try/catch块。

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 
} 

这是你在找什么?

+0

@Zach:你明白我的意思。但我在这里有点困惑。假设我为此创建了一个程序集,然后将其包含到其他项目中。我不使用任何异常处理程序,然后发生异常的地方?我的意思是在我的dll或用户代码中。我感觉好像我的dll会挂在那一点上。而使用dll的用户会陷入困境,他的所有应用程序将会异常关闭。是这样吗 ? – 2010-04-24 07:07:35

+1

@Shantanu:只要你让你的自定义异常类为public,你的其他项目将能够捕获你抛出的自定义异常。如果没有,另一个项目会崩溃(除非它捕获所有'Exception's,但这样做被认为是不好的做法)。 – 2010-04-24 07:16:34

2

这不是正确的做法。首先,用户输错某些东西没有任何特殊之处。其次,这种扩展方法可能会被深深地嵌入某种与数据库协同工作的代码中。你赶上例外,因为打字错误是正常的。但是你现在也有编写异常处理程序的负担和一堆可以正确恢复程序状态的代码。

验证用户输入应该尽早发生,然后才能启动难以停止的一系列代码。没有理由在用户输入验证中使用异常,一个简单的if()语句可以完成工作。

您现在可以保留throw语句,如果您愿意,它确实可以提供更好的诊断。但是你永远不应该处理这个异常,因为它现在可以诊断代码中的一个错误。你不能用catch子句修正错误。

0

虽然问题已经解答,但我只是建议第二个解决方案。 抛出异常的想法应该是最后的选择。您可以使用以下方法实现相同。 PS:我没有在编辑器上输入这段代码,所以请原谅我的错误。