Как создать собственный обработчик исключений для пользовательских элементов управления или методов расширения - PullRequest
0 голосов
/ 24 апреля 2010

Я создаю метод расширения в 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 ]

2 голосов
/ 24 апреля 2010

Это не правильный способ сделать это. Во-первых, нет ничего исключительного в том, что пользователь что-то неправильно набирает. Во-вторых, этот метод расширения может вызываться глубоко вложенным в некоторый код, который работает, скажем, с базой данных. У вас есть , чтобы поймать исключение, поскольку ошибка при печати является нормальной. Но теперь у вас также есть бремя написания обработчика исключений и набора кода, который правильно восстанавливает состояние программы.

Подтверждение пользовательского ввода должно произойти рано, до того, как вы запустите последовательность кода, которую трудно остановить. И нет никаких причин использовать исключения при проверке пользовательского ввода, простой оператор if () выполняет свою работу.

Теперь вы можете оставить инструкцию throw на месте, если вы хотите, это делает диагностику лучше. Но вы никогда не должны обрабатывать это исключение, потому что теперь оно диагностирует ошибку в вашем коде. И вы не можете исправлять ошибки с предложениями catch.

1 голос
/ 24 апреля 2010

Трудно понять ваш вопрос, но похоже, что вы хотите выбросить исключение и обработать его там, где вы вызываете свой метод расширения. Если это так, вы почти там. Вы уже выдаваете исключение, просто поместите блок 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 голосов
/ 24 апреля 2010

Хотя на вопрос уже дан ответ, я бы просто предложил второе решение. Идея создания исключения должна быть последним вариантом. Вы можете достичь того же, используя следующий подход.

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: я не набирал этот код в редакторе, поэтому прошу прощения за любые опечатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...