Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1165474339
novoalex
2006-12-07 09:52
2006.12.31
Как реализовать в своём проекте...


2-1165673458
Pa5ha
2006-12-09 17:10
2006.12.31
Генератор управлялки к бд


15-1165847798
Yulia M
2006-12-11 17:36
2006.12.31
Огромное несчастье!


15-1165826256
zdm
2006-12-11 11:37
2006.12.31
Перенос параметров


2-1165939314
Болт
2006-12-12 19:01
2006.12.31
Из какой папки зпущенна программа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский