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

3 回答 3

2

这不是正确的做法。首先,用户输入错误并没有什么特别的。其次,这种扩展方法很可能被深深地嵌套在某种与数据库一起工作的代码中。您必须捕获异常,因为输入错误是正常的。但是您现在还需要编写异常处理程序和一堆正确恢复程序状态的代码。

验证用户输入应该尽早进行,在您启动一连串难以停止的代码之前。并且没有理由在用户输入验证中使用异常,一个简单的 if() 语句就可以完成工作。

您现在可以保留 throw 语句,如果您愿意,它确实有助于更好的诊断。但是您永远不应该处理该异常,因为它现在可以诊断代码中的错误。而且您无法使用 catch 子句修复错误。

于 2010-04-24T09:39:00.960 回答
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
}

这是你想要的?

于 2010-04-24T06:45:05.400 回答
0

虽然问题已经得到解答,但我只是建议第二种解决方案。抛出异常的想法应该是最后的选择。您可以使用以下方法实现相同的目的。

public static bool TryGetValue<T>(this DataGridView dgv, int RowNo, 
    string ColName, out T cellValue)
{
    cellValue = default(T);
    if (!dgv.Columns.Contains(ColName))
        return false;
    cellValue = (T)Convert.ChangeType(dgv.Rows[RowNo].Cells[ColName].Value, typeof(T));
    return true;
}

public static void Main(){
int desiredValue;
if(dataGridView.TryGetValue<int>(rowNumber, columnName, out desiredValue)){
    //Use the value
}
else{
    //Value can not be retrieved.
}
}

PS:我没有在编辑器上输入这个代码,所以请原谅任何错别字。

于 2010-04-24T11:48:27.463 回答