Как создать собственное исключение в C # - PullRequest
5 голосов
/ 16 сентября 2011

Я хочу создать собственное исключение в приложении Windows Form. Я пытаюсь добавить некоторые данные в базу данных.

Код:

try
{
    string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + 
      " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)");
    sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection);
    sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime);
    sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime);
    sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime);
    sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text);
    sqlCommand.ExecuteNonQuery();
}
catch (DataBaseException ex)
{
    MessageBox.Show(ex.Message);
}

Здесь я создал собственное исключение. Здесь я дал скалярную переменную @lastuptime вместо @lastupdatetime для захвата SqlException.

Вот мой класс DatabaseException.

class DataBaseException : Exception
{
    public DataBaseException(string Message)
        : base(Message)
    {

    }
    public DataBaseException(string message, Exception innerException)
        : base(message, innerException)
    {
    }
}

Здесь при запуске программы отображается ошибка на

 sqlCommand.ExecuteQuery();

но он не фиксирует ошибку и показывает текст сообщения. Я знаю, что сделал что-то не так. Я не знаю, правильно ли я создал пользовательскую обработку исключений.

Может ли кто-нибудь помочь мне? Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 16 сентября 2011

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

void UpdateDatabase()
{
//...
        try 
            { 

            } 
               // Your checks to identify - type of exception
               // ...
              // .net exception
              // Throw your custom exception in the appropriate block - 
              // throw new DatabaseException();
            catch (OutOfMemoryException ex1) 
            { 

            }
            catch (InvalidDataException ex2) 
            { 

            }
            // Generic exception
            catch (Exception ex3) 
            { 
                // throw new DatabaseException();
            } 
//....
}

// Method calling UpdateDatabase need to handle Custom exception
void CallUpdateDatabase()
{
 try
  {
    UpdateDatabase();
  }
  catch(DatabaseException dbEx)
  {
    // Handle your custom exception
  }
}
0 голосов
/ 16 сентября 2011

с классом броска, более подробная информация здесь.

http://msdn.microsoft.com/en-us/library/system.activities.statements.throw.aspx

С уважением.

0 голосов
/ 16 сентября 2011

Вот как бы я написал эту процедуру (более или менее). Убедитесь, что вы закрыли соединение с БД и используете с использованием конструкции для освобождения sqlCommand obj:

 try
    {
        string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)");
        using (sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection))
        {
            sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime);
            sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime);
            sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime);
            sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text);

            sqlCommand.ExecuteNonQuery();
        }
    }
    catch (Exception ex)
    {
        string s = "Failed to insert into table " + constants.PIZZABROADCASTTABLE + "Database Error! " + Environment.NewLine + "Details: " + ex.ToString();
        MessageBox.Show(s, MessageBoxButtons.OK, MessageBoxIcons.Error);
        // Or
        //throw new DatabaseException(s, ex);
    }
    finally
    {
        if (databaseConnectivity != null && databaseConnectivity.connection != null) 
            databaseConnectivity.connection.Close();
        else
            MessageBox.Show("No database connectivity!", "Error", MessageBoxButtons.OK, MessageBoxIcons.Error); 
    }
0 голосов
/ 16 сентября 2011

с вашим собственным исключением все в порядке, но Sql.ExecuteQuery сгенерирует SqlException, вы можете сделать что-то вроде этого:

void CallDatabase( /* your parameters */)
{
    try
    {
        string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)");
        sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection);
        sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime);
        sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime);
        sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime);
        sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text);
        sqlCommand.ExecuteNonQuery();

    }
    catch (SqlException ex)
    {
        throw new DataBaseException("Database error", ex);
    }
}

/* somewhere in your code */
try
{
   CallDatabase(...);
}
catch (DataBaseException ex)
{
    MessageBox.Show(ex.Message);
}
0 голосов
/ 16 сентября 2011

Ни одно из свойств и методов SqlCommand не создает созданное вами исключение DatabaseException.Следовательно, ваш улов никогда не сработает.

Тот факт, что вы создали и вызвали свое исключение DatabaseException, не означает, что весь код «базы данных» теперь будет вызывать ваше исключение.Когда SqlCommand был написан, он был написан для создания очень специфического набора исключений.Вы можете найти список исключений, которые SqlCommand и его методы выдают на MSDN.

Дайте мне знать, если мой ответ не имеет смысла для вас.

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