Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Использование "пустых" try .. except   Найти похожие ветки 

 
Piter ©   (2006-12-08 21:02) [0]

Была тут ветка, где возник некоторый спор по поводу допустимости использования пустых блоков try .. except. Я придерживаюсь мнения, что в некоторых случаях это вполне нормально. Один мой оппонент придерживался обратного мнения, правда как всегда быстро срулил со словами, что со мной бесполезно спорить, даже не вникая в суть моих примеров :)

Но тут в очередной раз возникла ситуация, когда я оставил пустым try .. except, это что-то вроде того:

try
 ListBox1.Items.LoadFromFile("default.m3u");
except
end;


Правда, у того же WinAmp"а формат немного другой, там не одна строка на одну композицию, но опять же - не в этом дело.

Что в этом примере не так? Я загружаю плейлист по-умолчанию, если допустим нет такого файла - не загрузится, ну и что, останется пустым. Можно вручную будет добавлять треки. Просто погашение возможного исключения.


 
Palladin ©   (2006-12-08 21:04) [1]

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


 
TUser ©   (2006-12-08 21:05) [2]

Я бы писАл так
try
 ...
except
 on E:ХорошаОшибка do;
 

 ... else raise
end;


 
Kerk ©   (2006-12-08 21:05) [3]

И как юзер догадается - файл пустой или его нет?


 
вв ©   (2006-12-08 21:06) [4]

А можно мессаджбокс с рекламой телепатора продвинуть


 
TUser ©   (2006-12-08 21:06) [5]

... но в случае с сущестованием файла пишу
if FileExists() then ...


 
Anatoly Podgoretsky ©   (2006-12-08 21:07) [6]

> Piter  (08.12.2006 21:02:00)  [0]

try
ListBox1.Items.LoadFromFile("default.m3u");
except
 Log;
end;


 
Gero ©   (2006-12-08 21:14) [7]

В случае необязательности кода в блоке try ничего плохого в пустые except-ах нет. Ну не прокатило — и фиг с ним, нам даже не нужно знать, почему.
Хотя в таких случаях можно, например, в лог писать. Будет очень правильно и все каноны соблюдены.


 
Gero ©   (2006-12-08 21:15) [8]

> [5] TUser ©   (08.12.06 21:06)

Это не всегда будет правильнее, зависит от задачи.


 
Gero ©   (2006-12-08 21:15) [9]

> [6] Anatoly Podgoretsky ©   (08.12.06 21:07)

Да, я о том же.


 
MikePetrichenko ©   (2006-12-08 21:24) [10]


> try
> ListBox1.Items.LoadFromFile("default.m3u");
> except
>  Log;
> end;

Вот вы любите усложнить задачу.
Я очень часто использую
try

except
end;
Ну не нужно мне это исключение. Ну не получилось и ладно. И логи мне не нужны, потому как я ОЖИДАЮ эту ошибку и знаю что она рано или поздно случится. Вот живой пример.
Переменная TDateTime. Она может быть 0 а может и не быть 0 (дата есть). При приобразовании в троку будет исключение. Но у меня строка до преобразования уже пустая. Нафига мне еще что-то обрабатывать. Получилось ну и отлично. Вывели отформатированные дату и время. Не получилось. Тоже не велика беда. Вывели пустую строку.


 
Anatoly Podgoretsky ©   (2006-12-08 21:26) [11]

> Palladin  (08.12.2006 21:04:01)  [1]

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

except
  on E:Exception do begin
    ErrorMsg := E.Message;
//     Log();
  end;
end;

Можно поставить точку и узнать точную причину. Как минимум это удобно при отладке и при непонятном поведении программы.


 
Piter ©   (2006-12-08 21:26) [12]

Kerk ©   (08.12.06 21:05) [3]
И как юзер догадается - файл пустой или его нет?


а зачем ему это знать? Например, ты сформировал плейлист - он у тебя при загрузке есть. А потом ты удалил этот файл - при загрузке у тебя пустой плейлист. Что же теперь?

Такая же идеология у каких-нибудь INI-файлов, ты же не выдаешь предупреждение каждый раз, когда в INI  отсутствует нужный параметр? Файла INI и вообще может не быть, просто грузишь константы по дефолту, если это возможно.

Так вот тут действие по дефолту - пустой файл-лист, так он и есть пустой при создании, поэтому ничего в except предпринимать не имеет смысла.

Anatoly Podgoretsky ©   (08.12.06 21:07) [6]
try
ListBox1.Items.LoadFromFile("default.m3u");
except
Log;
end;


вы уже фигней маетесь. Сейчас начнете рассказывать, что в каждой программе должен быть класс по ведению логов, и ПОЭТОМУ except никак не может пустовать.

А в моей программе нету вот логов. Да и не нужны они там. И вообще, логи - это отдельно, вы уже специально придумываете, ЧТО можно вставить в except в любом случае.

То есть логика из "а нужно ли что-то вставить в except" у вас трансформировалась в логику "чтобы блин такое придумать, чтобы вставить в except".

Хорошо, если вам проще - представьте, что это не EXE-программа, а готовый компонент, который внутри себя использует ListBox. Компонент не должен вести логов.


 
Anatoly Podgoretsky ©   (2006-12-08 21:27) [13]

> TUser  (08.12.2006 21:05:02)  [2]

Или такой путь, если надо игнорировать ошибки только определенного класса, а вот использование

except
end

ничем не обосновано, благими намерениями строится дорога в ад.


 
Piter ©   (2006-12-08 21:28) [14]

Anatoly Podgoretsky ©   (08.12.06 21:26) [11]
Можно поставить точку и узнать точную причину


а у меня в опциях delphi настроен вывод исключений дебагером.


 
Anatoly Podgoretsky ©   (2006-12-08 21:29) [15]

> Gero  (08.12.2006 21:14:07)  [7]

Не обязательно в лог, но пути для отладки надо оставить, а тут как серпом по одному месту.


 
Anatoly Podgoretsky ©   (2006-12-08 21:31) [16]

> Gero  (08.12.2006 21:15:09)  [9]

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

Это я недавно прочувствовал на себе.


 
Eraser ©   (2006-12-08 21:33) [17]

тут такое дело, в небольшом проекте можно делать как угодно.
а вот в большом (на несколько десятков или сотен тысяч строк кода) нужно изначально предусмотреть логирование.


 
Anatoly Podgoretsky ©   (2006-12-08 21:36) [18]

> MikePetrichenko  (08.12.2006 21:24:10)  [10]

С какой стати преобразование 0 вызовет исключение? Он отлично преобразуется в дату без каких либо исключений.

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

Допустим я согласился, что преобразования нуля может вызвать исключение, ну такой я доверчивый, но кто же мешает писать иначе?

try
  var := Convert
except
  var := "";
end;

В чем проблема, кроме психологических заморочек.


 
Anatoly Podgoretsky ©   (2006-12-08 21:38) [19]

> Piter  (08.12.2006 21:26:12)  [12]

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


 
Palladin ©   (2006-12-08 21:40) [20]


> [11] Anatoly Podgoretsky ©

ну видимо потому что

Try
...
Except
{$ifdef debug}
WriteLog(GetExceptString);
{$endif}
End;


 
Anatoly Podgoretsky ©   (2006-12-08 21:43) [21]

> Palladin  (08.12.2006 21:40:20)  [20]

Можно и так, важно что бы блок не был пустым, а то жизнь она накажет строго.


 
default ©   (2006-12-08 21:45) [22]

делать как в [11], конечно, не надо
современные визуальные среды с отладчика предоставляют подобные данные и без ручной работы


 
Piter ©   (2006-12-08 22:35) [23]

Anatoly Podgoretsky ©   (08.12.06 21:36) [18]
try
 var := Convert
except
 var := "";
end;

В чем проблема, кроме психологических заморочек


в том, что значение "var" УЖЕ равно пустой строке, нафига перепресваивать?


// вот в этом месте кода значение "var" = ""
try
 var := Convert
except
 var := "";
end;


Ну и какой смысл в переприсвоении? Да, так можно сделать, ошибки нет, но ЗАЧЕМ?

Я рассуждаю на тему нужно / не нужно, вы же рассуждаете по-другому: "Поставить что-нибудь нужно обязательно!!! Надо только придумать что".

Anatoly Podgoretsky ©   (08.12.06 21:38) [19]
Если ты не понял о чем речь, то лучше не открывать лог, тем более нападать.
Ну я уже давно не обращаю внимания на твои нападки


оно и видно, что не обращаете :)
Вы меня загипнотизировать хотите, каждый раз повторяя, что не обращаете внимания на мои нападки или чтобы самому в это поверить? :) :) :)

Anatoly Podgoretsky ©   (08.12.06 21:43) [21]
важно что бы блок не был пустым


это важно только для того, чтобы Анатолий Подгорецкий был прав.

не надо в except пихать абы что, лишь бы ОН БЫЛ НЕ ПУСТОЙ. Если ты четко понимаешь, зачем это и для чего - можно и оставить пустым. Если понимаешь.

default ©   (08.12.06 21:45) [22]
делать как в [11], конечно, не надо
современные визуальные среды с отладчика предоставляют подобные данные и без ручной работы


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

Можно даже присвоить какой-нибудь введенной переменной какое-нибудь значение, пофигу что оптимизатор все равно выкинет этот блог, главное не оставлять except пустым...


 
Kerk ©   (2006-12-08 22:42) [24]

> // вот в этом месте кода значение "var" = ""
> try
> var := Convert
> except
> var := "";
> end;
>
> Ну и какой смысл в переприсвоении? Да, так можно сделать,
> ошибки нет, но ЗАЧЕМ?

Никто ничего не переприсваивает

А вот тут переприсваивание:
var := "";
try
 var := Convert
except
end;


 
Anatoly Podgoretsky ©   (2006-12-08 22:43) [25]

> Piter  (08.12.2006 22:35:23)  [23]

> Вы меня загипнотизировать хотите, каждый раз повторяя, что не обращаете внимания на мои нападки или чтобы самому в это поверить? :) :) :)

Это мантра для тебя.


 
Anatoly Podgoretsky ©   (2006-12-08 22:44) [26]

> Piter  (08.12.2006 22:35:23)  [23]

// вот в этом месте кода значение "var" = ""

А почему в этом месте он пустой?
Всегда пустой? А почему, а если не пустой, а у меня гарантия.


 
Petr V. Abramov ©   (2006-12-08 22:45) [27]

try
ListBox1.Items.LoadFromFile("default.m3u");
except
Log;
end;

вот из-за таких подходов и кодеров не хватает. Не заму...ся на каждую ситуацию так писать? Не лучше ли ОДИН раз потрудиться сделать запись в лог, например, в application.onexception

> существует много других случаев когда нужно просто проигнорировать
> исключение, бо последующие действия никак от нее него зависят...
 существует, но редко. поэтому, ИМХО, должно считаться дурным тоном, почти как goto, которое тоже иногда ну очень полезно. ну очень иногда :)


 
Anatoly Podgoretsky ©   (2006-12-08 22:45) [28]

> Piter  (08.12.2006 22:35:23)  [23]

Кстати я смотрю ты уже иногда и try except начал пользоваться, это у прогресс, осталось еще немного поднапряться


 
Anatoly Podgoretsky ©   (2006-12-08 22:47) [29]

> Kerk  (08.12.2006 22:42:24)  [24]

Чистой воды переприсвоение, ну лишь бы except пустым оставить.


 
Gero ©   (2006-12-08 23:04) [30]

> [23] Piter ©   (08.12.06 22:35)

Еще раз говорю, все зависит от задачи.
Предположим, у пользователя есть файл default.m3u, он видит его, но программа его не загружает. Притом программа знает почему его не удалось загрузить. Но молчит. Он пишет в саппорт — и как саппорту определить, в чем же проблема?
Так вот, если это записать в лог, достаточно посмотреть лог и определить, что же произошло: нет прав для чтения файла, файл заблокирован другим процессом, а может просто указан относительный путь, а текущий каталог совсем не тот, что нужно, а может еще что. Не важно что, важно, что любая ошибка, неправильная работа при таком подходе может быть быстро исправлена, и не в момент разработки, а уже будучи установленной у пользователя.


 
Gero ©   (2006-12-08 23:05) [31]

> [23] Piter ©   (08.12.06 22:35)

Или ты просто с Анатолием поспорить хочешь? Если да, то скажи, я не буду мешать.


 
Anatoly Podgoretsky ©   (2006-12-08 23:09) [32]

> Gero  (08.12.2006 23:05:31)  [31]

Да нет, мы просто подкалываем друг друга, а со стороны кажется иначе.
А если хочешь, то тоже присоединяйся.


 
Piter ©   (2006-12-08 23:10) [33]

Anatoly Podgoretsky ©   (08.12.06 22:45) [28]
Кстати я смотрю ты уже иногда и try except начал пользоваться, это у прогресс, осталось еще немного поднапряться


а... левая уколка. Я except"ы писал, когда у вас еще бороды не было :) :) :)

А вот то, что вы начинаете копировать мой стиль разговора говорит о том, что сами придумать ничего не можете.

Так что 1:0 - слив засчитан, все свободны :)

P.S. Итог: да, в большинстве (подавляющем) случаев в except надо писать, но не всегда. Когда ты четко понимаешь, что ты делаешь - можно и пустым оставлять.


 
Anatoly Podgoretsky ©   (2006-12-08 23:13) [34]

> Piter  (08.12.2006 23:10:33)  [33]

> Я except"ы писал, когда у вас еще бороды не было :) :) :)

Неужели 60 лет назад?

> Так что 1:0 - слив засчитан, все свободны :)

так просто не отделаешься.

> Когда ты четко понимаешь, что ты делаешь - можно и пустым оставлять.

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


 
Piter ©   (2006-12-08 23:13) [35]

Gero ©   (08.12.06 23:04) [30]
Еще раз говорю, все зависит от задачи


вот именно. Есть задачи, где не обязательно ставить :) Я вовсе не утверждаю, что в except НИКОГДА ничего не надо писать.

Засим и закончим :)


 
Anatoly Podgoretsky ©   (2006-12-08 23:14) [36]

> Piter  (08.12.2006 23:13:35)  [35]

Как это закончим, мы еще не начинали, в понедельник придет подкрепление.


 
Piter ©   (2006-12-08 23:15) [37]

Anatoly Podgoretsky ©   (08.12.06 23:13) [34]
Как минимальный уровень я указал использование отладочной переменной.


что такое отладочная переменная? Просто отфонарная, которая инициализируется только в этом except?

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

И нафига это вообще нужно? Вамже уже сказали, что современные IDE позволяют исключения дебагером ловить, не надо никуда ничего ставить, они и так отобразятся в run-time


 
Gero ©   (2006-12-08 23:16) [38]

> [35] Piter ©   (08.12.06 23:13)

Речь не о никогда, но в 99% случаев лучше бы написать.


 
Kerk ©   (2006-12-08 23:16) [39]

try
ListBox1.Items.LoadFromFile("default.m3u");
except
end;


Произойдет здесь какое-нибудь не файл_не_найден, а эксесс виолейшн... и будешь потом искать где.


 
Palladin ©   (2006-12-08 23:18) [40]

там где оно всплывет, а именно при первом обращении к listbox1
все ясно и понятно



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.046 c
15-1165432260
Kerk
2006-12-06 22:11
2006.12.31
Погода


2-1165740046
Ильдар
2006-12-10 11:40
2006.12.31
DBLookupComboBox


2-1165962183
Khabibulin
2006-12-13 01:23
2006.12.31
Календарь


2-1165890072
dreamse
2006-12-12 05:21
2006.12.31
Подскажите метод генерации нового имени RealTime компонента


3-1161331615
vvrz
2006-10-20 12:06
2006.12.31
вызов хранимой процедуры MS SQL