Как создать пользовательское исключение в c#


Я хочу создать свое собственное исключение в приложении 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 4

5 ответов:

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

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
  }
}

Ни одно из свойств и методов SqlCommand не вызывает созданного Вами исключения DatabaseException. Поэтому ваш улов никогда не сработает.

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

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

Ваше собственное исключение прекрасно, но 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);
}

Вот как я написал бы эту процедуру (более или менее). Убедитесь, что вы закрыли соединение с БД и используете Использование построить, чтобы освободить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); 
    }

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

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

С уважением.