如何为自定义控件或扩展方法创建自定义异常处理程序

时间:2010-04-24 06:23:19

标签: c# .net exception exception-handling custom-exceptions

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

3 个答案:

答案 0 :(得分:2)

这不是正确的方法。首先,用户错误输入内容没有什么特别之处。其次,这种扩展方法很容易被称为深度嵌套在某种与数据库一起工作的代码中。您来捕获异常,因为输入错误是正常的。但是你现在还要负担编写异常处理程序和一堆能够正确恢复程序状态的代码。

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

您现在可以将throw语句留在原位,如果您愿意,它确实可以提供更好的诊断。但是你永远不应该处理这个异常,因为它现在诊断出代码中的错误。并且您无法使用catch子句修复错误。

答案 1 :(得分: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
}

这是你在找什么?

答案 2 :(得分: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:我没有在编辑器上输入此代码,所以请原谅任何错别字。