Форум: "Прочее";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизИспользование "пустых" 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;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.037 c