powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Критика кода
21 сообщений из 21, страница 1 из 1
Критика кода
    #33883329
californie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть код: try
{

SqlConnection connection = new SqlConnection(connectionString);
     ...
connection.Open();
try
{
command.ExecuteScalar();
}
catch (Exception ex)
{
        ...
}
finally
{
connection.Close();
}
}
catch (Exception e)
{
        ...
}
return success;



в нем как видно есть 2 try-catch вложенных друг в друга

лично мне это не нравится. в данном случае мне это кажется непрофессиональным.
Что думаете?
...
Рейтинг: 0 / 0
Критика кода
    #33883346
ZeusTheTrueGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а у меня есть два if, вложенных друг в друга
if (a > 0)
{
...
if (b>0)
{
}
...
}

Тоже считаете не профессиональным и предлагаете раскрыть скобки?
...
Рейтинг: 0 / 0
Критика кода
    #33883381
californie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваш пример не имеет связи с кодом о котором идет речь
...
Рейтинг: 0 / 0
Критика кода
    #33883396
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
првильный ответ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlConnection connection = new SqlConnection(connectionString);
try
{
  connection.Open();
  command.ExecuteScalar();
}
catch (Exception e) {}
finally
{
  connection.Close();
}
return success;
_______________________________________________________
Never ask users what they want, or they'll tell you.
...
Рейтинг: 0 / 0
Критика кода
    #33883407
californie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем, я с вами полностью согласен
...
Рейтинг: 0 / 0
Критика кода
    #33883411
BoyStav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы сделал так...

using(SqlConnection connection = new SqlConnection(connectionString))
{
...
using(SqlCommand command = connection.CreateCommand())
{
try
{
connection.Open();
command.ExecuteScalar();
}
catch(Exception ex)
{
...
}
finally
{
connection.Close();
}
}
}
 

can be done...
...
Рейтинг: 0 / 0
Критика кода
    #33883466
ZeusTheTrueGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вложенные try catch не свидетельсвуют о непрофессионализме
...
Рейтинг: 0 / 0
Критика кода
    #33883524
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeusTheTrueGodВложенные try catch не свидетельсвуют о непрофессионализме
да. но лишние...
2BoyStav , у тебя что паранойя? :)
если делаешь
Код: plaintext
using(SqlConnection connection = new SqlConnection(connectionString))
то
Код: plaintext
1.
2.
3.
finally
{
connection.Close();
}
нафиг не нужно
...
Рейтинг: 0 / 0
Критика кода
    #33883528
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2BoyStav
И кстати SqlCommand не поддерживает IDisposable, так что и
Код: plaintext
using(SqlCommand command = connection.CreateCommand())
нафиг не нужно
ЗЫ: упрощать сложно - усложнять легко ;)
_______________________________________________________
Never ask users what they want, or they'll tell you.
...
Рейтинг: 0 / 0
Критика кода
    #33884321
Nisus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчет паранойи согласен, вызов Close при условии использования using-а излишен. Но код Артема тоже грешит излишними исходными предпосылками, в конкретно этом простейшем случае этот код сработает:SqlConnection connection = new SqlConnection(connectionString);
try
{
 connection.Open();
 command.ExecuteScalar();
}
catch (Exception e) {}
finally
{
 connection.Close();
}

Однако в реальном приложении в блоке try излишне ретивый программист вполне может написать так:
connection.Close();
connection = null;


А что может твориться в блоке catch вообще представить страшно.
В результате мы получим исключение в блоке finally на ровном месте.
Идеальный вариант - оборачивать SqlConnection в using, это будет защищенный от ошибок код by design. Однако этот оператор есть не во всех языках, соответственно можно использовать и вариант с finally но перед вызовом методов обязательно проверять существование объекта, а для класса SqlConnection неплохо бы еще и проверить его текущий статус. В итоге код выглядеть будет как-то так:SqlConnection connection = new SqlConnection(connectionString);
try
{
    //...
    connection.Open();
    command.ExecuteScalar();
    //...
}
catch (Exception e) {}
finally
{
    if (connection != null
        && connection.State == ConnectionState.Open)
    {
        connection.Close();
    }
}
...
Рейтинг: 0 / 0
Критика кода
    #33884519
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Nisus, твой код конечно выглядит лучше, но речь то шла не о том как правильно закрыть коннект, а о лишних блоках try...catch
_______________________________________________________
Never ask users what they want, or they'll tell you.
...
Рейтинг: 0 / 0
Критика кода
    #33884544
californie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeusTheTrueGod , иногда свидетельствует.
у МС даже вопросы на эту тему есть

в дополнение к коду Артема, я бы предложил в final блок поставить еще 1 try-catch для проверки закрытия конекта
...
Рейтинг: 0 / 0
Критика кода
    #33884558
Nisus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я поэтому и ответил не на вопрос автора, а на подветку
...
Рейтинг: 0 / 0
Критика кода
    #33885308
dotnetcoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обсасывали уже эту тему здесь http://www.gotdotnet.ru/Forums/Data/117159.aspx?page=2147483647
-- Если тебе помогли, незабудь сказать спасибо --
-- Это всё мое личное мнение которое может не совпадать с Вашим или может быть ошибочным --

.NetCoder
...
Рейтинг: 0 / 0
Критика кода
    #33888661
Spaider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Nisus, Вы писали:

N>Идеальный вариант — оборачивать SqlConnection в using, это будет защищенный от ошибок код by design. Однако этот оператор есть не во всех языках, соответственно можно использовать и вариант с finally

Ну, во-первых, как уже было замечено, SqlConnection не реализует IDisposable, так что обернуть его в using (...) не получиться хоть ты тресни.
Во-вторых, using(...) -- это syntactical sugar для C#, в IL всё равно конструкция разворачивается в try{...}finally{...}... << RSDN@Home 1.2.0 alpha rev. 650>>
...
Рейтинг: 0 / 0
Критика кода
    #33888740
Nisus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во-первых, SqlConnection как раз наследует и замечательно реализует метод Dispose() интерфейса IDisposable, так что обернуть его в using(...) замечательно получится и трескать никого не придется. Для справки есть такой сайт MSDN, много интересного пишут http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqlconnectionmemberstopic.asp

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

А так я вообще-то тоже за try-finally, незачем упрощать себе жизнь, да и хорошая читаемость кода ни к чему хорошему еще не приводила, того и гляди коллеги подсидят.




Автор:
Spaider, 31.07.06 11:50

Тема:
Re[2]: Критика кода

Сообщение:
Здравствуйте, Nisus, Вы писали:

N>Идеальный вариант — оборачивать SqlConnection в using, это будет защищенный от ошибок код by design. Однако этот оператор есть не во всех языках, соответственно можно использовать и вариант с finally

Ну, во-первых, как уже было замечено, SqlConnection не реализует IDisposable, так что обернуть его в using (...) не получиться хоть ты тресни.
Во-вторых, using(...) -- это syntactical sugar для C#, в IL всё равно конструкция разворачивается в try{...}finally{...}
...
Рейтинг: 0 / 0
Критика кода
    #33888788
Spaider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Nisus, Вы писали:

N>Ну во-первых, SqlConnection как раз наследует и замечательно реализует метод Dispose() интерфейса IDisposable, так что обернуть его в using(...) замечательно получится и трескать никого не придется. Для справки есть такой сайт MSDN, много интересного пишут http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqlconnectionmemberstopic.asp

Нда, тут ошибочка вышла. Я, если честно, по быстрым вопросам не в MSDN лезу, а в Reflector. Вот тут и поленился раскрыть базовые интерфейсы для IDbConnection, не заметил, что он наследует IDisposable.... << RSDN@Home 1.2.0 alpha rev. 650>>
...
Рейтинг: 0 / 0
Критика кода
    #33889283
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpaiderНу, во-первых, как уже было замечено, SqlConnection не реализует IDisposable, так что обернуть его в using (...) не получиться хоть ты тресни.
эээээ...читай внимательно, что было замечено! ;-)
...
Рейтинг: 0 / 0
Критика кода
    #33897594
BoyStav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
теперь по полкам...

1) IDisosible реализуется как SqlConnection так и SqlCommand.
2) Вызов close при оборачивании в using не излишен, так как освобождение ресурсов не гарантирует закрытие соединения (хотя скорее всего закрывает).
3) падение на close в блоке finally маловероятно, и если оно произошло, то это надо ловить гораздо выше и очень сильно задуматься над причиной данного инцендента.can be done...
...
Рейтинг: 0 / 0
Критика кода
    #33897788
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoyStav
1) IDisosible реализуется как SqlConnection так и SqlCommand.

Хоть SqlCommand и наследует IDisposable, но реализирует его, класс Component, от которого SqlCommand наследуеца (если не ошибаюсь это нужно для дизайнера). Но никакой логики SqlCommand в Dispose не добавляет, так что оборачивать его в using совершенно не нужно
BoyStav
2) Вызов close при оборачивании в using не излишен, так как освобождение ресурсов не гарантирует закрытие соединения (хотя скорее всего закрывает).

а вот другое дело с SqlConnection. Этот класс переопределяет метод Dispose(bool disposing) и добавляет свою логику, которая разрешает нам использовать using для коректного закрытия соединения. Так что "Вызов close при оборачивании в using" излишен . Нафига тогда нам вообще using использовать?!

Вот кстати как он реализирован
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
protected override void Dispose(bool disposing)
{
      if (disposing)
      {
            switch (this._objectState)
            {
                  case ConnectionState.Open:
                        this.Close();
                        break;
            }
            this._constr = null;
      }
      base.Dispose(disposing);
}

BoyStav
3) падение на close в блоке finally маловероятно, и если оно произошло, то это надо ловить гораздо выше и очень сильно задуматься над причиной данного
ну а с этим согласен
...
Рейтинг: 0 / 0
Критика кода
    #33897870
BoyStav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не имею привычки разбирать стандартные библиотеки...
но спасибо за разяснения, пункт 1 по боку, всеравно буду оборачивать :) сейчас ничего нет, потом будет... :)

А по поводу пункта 2 вобще громадное спасибо, теперь я буду уверен что там есть закрытие соединения ( я и так был правктически уверен ), но как говориться береженого бог бережет :)can be done...
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Критика кода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]