Попытка / Catch не улавливает

#c# #winforms #exception #try-catch

#c# #winforms #исключение #try-catch

Вопрос:

В следующем коде я намеренно ошибочно ввожу «@FooData» в «@foo111Data», чтобы проверить, перехватывает ли оператор try мое исключение. Смотрите приведенный ниже код. Но инструкция try / catch не перехватила и не отобразила исключение в MessageBox, и VS2010 просто прерывает работу и выделяет строку неправильного кода.

 try
{
    conn.Open();
    cmd.Parameters.AddWithValue("@foo111Data", dataStrTb1.Text);
    cmd.ExecuteNonQuery();
}
catch (SqlCeException ex)
{
    MessageBox.Show(ex.ToString());
}
finally
{
    conn.Close();
}
  

Комментарии:

1. Какого типа генерируется исключение?

2. Я думаю, что вы работаете в режиме отладки, я думаю, это будет нормально работать в режиме перезагрузки.

3. Вы уверены, что SqlCeException (или любое другое) исключение должно быть сгенерировано? Вместо этого вы могли бы попробовать с System.Exception .

Ответ №1:

Возможно, генерируется исключение другого типа? Я бы посоветовал вам изменить catch так, чтобы он просто улавливал общий Exception , и посмотреть, выдает ли он другой тип.

Поставьте точку останова в catch инструкции, в MessageBox.Show строке, и тогда вы сможете проверить Exception .

Ответ №2:

Попробуйте перехватить SQLException

 catch (SqlException ex)
{
    MessageBox.Show(ex.ToString());
}
  

Ответ №3:

вместо исключения SqlCeException попробуйте перехватить все исключения и посмотреть, как это работает.

Я бы на самом деле использовал регистратор, а не просто messagebox, как вы делаете сейчас.

Ответ №4:

Попробуйте

 try 
{     
conn.Open();     
cmd.Parameters.AddWithValue("@foo111Data", `dataStrTb1.Text);     
cmd.ExecuteNonQuery(); 
} 
catch (SqlException ex) 
{     
MessageBox.Show(ex.ToString()); 
}
catch (Exception ex) 
{     
MessageBox.Show(ex.ToString()); 
} 

finally 
{     
conn.Close(); 
}` 
  

Комментарии:

1. если бы действительно нужно было написать другой пример, я бы также использовал блок Using вокруг соединения и отслеживал ex.Message вместо ex. toString() … 🙂

2. Моя идея заключалась в том, чтобы перехватить исключение, чтобы ни одно исключение не было не перехвачено. Извините, если вы возражаете против этого 🙂

Ответ №5:

В Visual Studio есть функция, которая позволяет вам останавливаться при возникновении исключения, даже если оно перехватывается.

Просто нажмите на меню отладки, затем на Исключения, затем на столбец «выброшено» и снимите пометки с определенных исключений, которые вы не хотите, чтобы отладчик автоматически прерывал работу.