Пользовательские сообщения об исключении С#

Как мне настроить собственное сообщение об ошибке на основе какой ошибки?

protected void btnNew_Click(object sender, EventArgs e)
 {
 Clear();
 SqlCommand command = conn.CreateCommand();
 SqlDataReader reader;
 try
 {
 command.CommandText = "GetMax";
 command.CommandType = CommandType.StoredProcedure;
 conn.Open();
 reader = command.ExecuteReader(); 
 while (reader.HasRows)
 {
 while (reader.Read())
 {
 int CustMax = reader.GetInt32(0);
 CustMax++;
 txtCustID.Text = CustMax.ToString();
 }
 reader.NextResult();
 }
 reader.Dispose();
 }
 catch (SqlException ex)
 {
 lblMessage.Text = ex.Message;

 }
 finally
 {
 command.Dispose();
 conn.Dispose();
 }
 }

В этом блоке кода, если обнаружено исключение SqlException, это сообщение отображается в lblMessage.

Главное, на что я смотрю, - это соединение с базой данных или нет. Если этого не произошло, это приводит к следующей ошибке "При установлении соединения с SQL Server возникла связанная с сетью или конкретная ошибка экземпляра. Сервер не был найден или недоступен. Убедитесь, что имя экземпляра верное и что SQL Server настроен на разрешение удаленных подключений (поставщик: поставщик именованных труб, ошибка: 40 - Не удалось открыть соединение с SQL Server) ".

Если возникает ошибка 40, я хочу установить lblMessage в "Невозможно подключиться к базе данных", но если возникает другое SqlException, оно должно опубликовать полное сообщение об ошибке.

2 ответа

Вот как вы справляетесь,

catch (SqlException ex)
 {
 if(ex.Number == 40 ) // or Use whatever the number it returns for the relevant error
 {
 MessageBox.Show("Relevant SQL Error Occured");
 }
 else
 {
 MessageBox.Show("None Relevant SQL Error Occured:" + ex.toString());
 }
 }
 catch(Exception ex)// All other non sql errors
 {
 MessageBox.Show(ex.toString());
 }

Взгляните на эту технику обработки ошибок MSDN для получения дополнительной информации. Link


Вы можете изменить свой код, как

catch (SqlException ex)
 {
 if(ex.Number == 40) // 40 is specific key for network issue
 {
 lblMessage.Text = "Cannot connect to database" 
 }
 else
 { 
 lblMessage.Text = ex.Message;
 }
 }

Существует еще один способ добиться такой же

catch ((SqlException ex) {
if (ex.Message.Contains("A network-related or instance-specific error specific"))//Put the matching text here 
{
 lblMessage.Text = "Cannot connect to database" 
}
else
 { 
 lblMessage.Text = ex.Message;
 }
 }

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

licensed under cc by-sa 3.0 with attribution.