2010-04-24 2 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, поймает их в ловушку, и все его приложение будет закрыто abnorymally. Это так ? –

+1

@Shantanu: Пока вы создаете свои собственные классы исключений 'public', ваш другой проект сможет поймать пользовательские исключения, которые вы бросаете. Если нет, другой проект выйдет из строя (если только он не поймает все «Исключения», но это считается плохой практикой). –

2

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

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

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

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