C # «использование» оператора и попробуйте / поймать - PullRequest
2 голосов
/ 17 июня 2011

Сегодня я проводил некоторые исследования того, как использовать инструкцию «using» для удаления моих объектов sql.Однако я все еще не понимаю, когда и как отлавливать непредвиденные ошибки.У меня есть простой метод, и я был бы признателен за любые вводные данные, если они верны, или я делаю что-то не так?

private BindingList<My_Object> Search(int ID)
{
   string strSelectStatement = 
     "SELECT 'coloumns' " +
     "FROM 'table' " +
     "WHERE ID = @ID;";

     DataTable dt = new DataTable();
     try
     {
        using (SqlConnection sqlConn = new SqlConnection(m_SQLConnectionString))
        {
          using (SqlCommand cmd = new SqlCommand(strSelectStatement, sqlConn))
          {
            cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID;
            using (SqlDataAdapter adpt = new SqlDataAdapter(cmd))
            {
               adpt.Fill(dt);
            }
          }
        }

        My_Object myObject;
        BindingList<My_Object> myObjectList = new BindingList<My_Object>();

        foreach (DataRow row in dt.Rows)
        {
          myObject = new My_Object();
          //Fill/set myObject properties and add to myObject list
        }

        return myObjectList;
     }
     catch (Exception)
     {
        //throw the the exception with its stack trace up to the main call
        throw;
     }
}

Итак, что бы я сделал здесь - поймал ошибку, если что-то пошло не так при работе адаптера.Выполните или при создании myObject / list, например.

Спасибо

Ответы [ 6 ]

2 голосов
/ 17 июня 2011

В C #. Оператор using определяет область действия элемента, который должен быть удален. Это может быть вызвано для любого объекта, который реализует интерфейс IDisposable.

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

Таким образом, если бы вам не пришлось использовать блоки, вы бы вызвали метод dispose для класса, чтобы освободить / очистить ресурсы, созданные объектом.

При вызове класса, реализующего интерфейс IDisposable, шаблон try / finally обеспечивает удаление неуправляемых ресурсов, даже если исключение прерывает ваше приложение.

Если в случае оператора using выдается исключение, утилита будет по-прежнему вызываться. Вы также можете сложить, используя операторы

using (SqlConnection sqlConn = new SqlConnection(m_SQLConnectionString))
using (SqlCommand cmd = new SqlCommand(strSelectStatement, sqlConn))
          {
            cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID;
            using (SqlDataAdapter adpt = new SqlDataAdapter(cmd))
            {
               adpt.Fill(dt);
            }
          }

относительно обработки исключений. Нецелесообразно перехватывать все исключения, пытаться перехватить конкретные исключения, созданные классом или методом. Вы можете просмотреть сведения об исключении в MSDN, поэтому SQLConnection: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx

InvalidOperationException
Невозможно открыть соединение без указания источника данных или сервера.

или

Соединение уже открыто.

SqlException
Произошла ошибка на уровне соединения при открытии соединения. Если свойство Number содержит значение 18487 или 18488, это означает, что указанный пароль истек или должен быть сброшен. См. Метод ChangePassword для получения дополнительной информации.

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

2 голосов
/ 17 июня 2011

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

Возможно, вы ознакомились с MSDN "Рекомендации по обработке исключений" http://msdn.microsoft.com/en-us/library/seyhszts.aspx

2 голосов
/ 17 июня 2011

Не отлавливайте «непредвиденные» ошибки, так как вы ничего не можете сделать, если действительно непредвиденные.система делает это за вас - тогда они больше не «непредвиденные», так как вы ожидаете их.

Что касается размещенного кода, то есть проблемы.Во-первых, можно сказать, что try / catch пытается слишком много, и учитывая, что у вас есть using s, это бессмысленно (если исключения не будут обрабатываться.) Это такжеловит общее исключение, которое крайне не рекомендуется;catch es должны быть сформулированы для фильтрации тех, которые вы можете обрабатывать, и в соответствующем порядке.Поймать только до throw тоже бессмысленно.

1 голос
/ 17 июня 2011

Тебе не нужен try..catch {throw}.Это то же самое, что совсем не иметь блока try..catch.

Если вы хотите регистрировать ошибку отображения дружественного сообщения, поместите код в catch {}.

Утилита будет по-прежнему вызываться в SqlConnection, даже если код не работает.

0 голосов
/ 17 июня 2011

Поскольку вы вложили весь код в try / Catch, он будет перехватывать все ошибки, возникающие в блоке try / catch.Но не следуйте этой инструкции только для тех ошибок, которые вы хотите обработать или зарегистрировать.это рекомендуется, потому что ошибка перехвата является дополнительной.

0 голосов
/ 17 июня 2011

Вы можете поймать несколько исключений в конце вашего оператора try. Это означает, что вы можете перехватить каждый другой тип ошибки, которая может произойти, т.е. InvalidOperationException / SqlException. MSDN Объясняет здесь:

http://msdn.microsoft.com/en-us/library/ms173162(v=vs.80).aspx

...