Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

Тем, кто утверждает, что тело except не должно быть пустым   Найти похожие ветки 

 
Добежал   (2009-01-16 17:48) [0]

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

Вот встретил в проекте хороший пример:

var
 Document: IHTMLDocument2;
 Window: OleVariant;


...

try
 Window:=Document.parentWindow;
 Window.before_print_script;
except ;
end;


Смысл в том, что в HTML документе перед его печатью вызывается функция before_print_script (если она есть). По смыслу эту JS функция может выполнять всякие преобразования полезные (удобные) для печати. Но этой функции вполне может не быть, документ и так хорошо для печати подходит, но движок программы знать этого не может.

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

Или у приверженцев теории, что except низачто нельзя оставлять пустым, есть противо аргументы? Интересно.


 
Ганя   (2009-01-16 17:51) [1]

По хорошему, такие ситуации надо разруливать не try-except" ом, а IF"ом
IF before_print_script_Exists then ...


 
Игорь Шевченко ©   (2009-01-16 17:54) [2]


> Или у приверженцев теории, что except низачто нельзя оставлять
> пустым, есть противо аргументы? Интересно.


Ты тролль ?


 
Добежал   (2009-01-16 18:00) [3]


> По хорошему, такие ситуации надо разруливать не try-except"
> ом, а IF"ом


ну я тоже об этом думал. Но судя по всему в данной ситуации хрен это проверишь.


 
Mystic ©   (2009-01-16 18:06) [4]

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


Window:=Document.parentWindow;
try
Window.before_print_script;
except
 on E: EOleError do ;
end;


 
Медвежонок Пятачок ©   (2009-01-16 18:11) [5]

try
adoconnection.open();
Result := True;
except
try
 adoconnection.open("user","password");
 result := True;
except
 on E:Exceptiuon do ....
end;
end

В контексте вопроса верхний блок - пустой.
и все логично.


 
Медвежонок Пятачок ©   (2009-01-16 18:23) [6]

в параметрах подключения кнопка для adodb.prompdatasource и возможность ввести имя пароль.

я не знаю, какая строка подключения будет у юзера. с паролем и именем или с использованием nt аутентификации.

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

отсюда такой двуступенчатый try/except

и пустой верхний блок


 
oxffff ©   (2009-01-16 18:34) [7]


> Добежал   (16.01.09 17:48)  
> Возникали споры, правомерно ли в некоторых случаях оставлять
> тело except пустым


Все правомерно!!!

result:=CONST_EXCEPTION;
try
...........
IF WorkDoneWell then result:=CONST_OK
 else result:=CONST_NOT;
except
end;


 
Юрий Зотов ©   (2009-01-16 19:16) [8]

> oxffff ©   (16.01.09 18:34) [7]
> Все правомерно!!!

Только кривовато немного, вот так посимпатичнее будет:

try
 if WorkDoneWell then
   result := CONST_OK
 else
   result := CONST_NOT;
except
 result := CONST_EXCEPTION;
end;

> All

Как показывает этот и многие другие примеры, при правильном кодинге необходимость оставлять секцию except пустой просто не возникает.
:о)


 
Добежал   (2009-01-16 19:22) [9]


> при правильном кодинге необходимость оставлять секцию except
> пустой просто не возникает


ну тогда как "правильно" переписать пример?

try
 Window:=Document.parentWindow;
 Window.before_print_script;
except ;
end;


Ведь здесь как видно секция except пустая оказалась.


 
oxffff ©   (2009-01-16 19:25) [10]


> Юрий Зотов ©   (16.01.09 19:16) [8]
> > oxffff ©   (16.01.09 18:34) [7]
> > Все правомерно!!!
>
> Только кривовато немного,


Кривость насколько я понял состоит в том, что обращение к result при нормальном режиме 2 раза?


> Как показывает этот и многие другие примеры, при правильном
> кодинге необходимость оставлять секцию except пустой просто
> не возникает.
> :о)


Как показывает этот и многие другие примеры, подходов к программированию может быть не один.

try
if WorkDoneWell then
  result := CONST_OK
else
  result := CONST_NOT;
exit;
except
end;
result := CONST_EXCEPTION;


 
Ega23 ©   (2009-01-16 19:33) [11]


function TURSCmdMngr.OnAccUsrChangePwd2(Request: TFCGIRequest): Integer;
var
 param : TFCGIParameter;
 OldPwd, NewPwd : string;
begin
 Result := rrDataError;
 try
   param := Request.FCGParams.ParamByName(wc_OldPwd);
   if param=nil then Exit;
   OldPwd := param.AsString;

   param := Request.FCGParams.ParamByName(wc_NewPwd);
   if param=nil then Exit;
   NewPwd := param.AsString;

   StreamWriteString(Request.InData, OldPwd, ACU_AccUsrOldPwd);
   StreamWriteString(Request.InData, NewPwd, ACU_AccUsrNewPwd);

   Result := rrOK;
except on E : Exception do
   OnException("TURSCmdMngr.OnAccUsrChangePwd2 : " + E.Message);
 end;
end;


 
oxffff ©   (2009-01-16 19:38) [12]


> Юрий Зотов ©   (16.01.09 19:16) [8]
> > oxffff ©   (16.01.09 18:34) [7]
> > Все правомерно!!!
>
> Только кривовато немного, вот так посимпатичнее будет:
>
> try
>  if WorkDoneWell then
>    result := CONST_OK
>  else
>    result := CONST_NOT;
> except
>  result := CONST_EXCEPTION;
> end;


Однако про кривость помогу так прокомментировать.
При некоторых обстоятельствах(механизме информирования о результате) предварительная установка ошибки может быть более предпочтительная, чем уведомление об ошибки в момент ошибки(причем это не всегда возможно сделать сообщить об ошибке).
Естественно речь идет не возврате через переменную, а например через callback процедуру.


 
b z   (2009-01-16 19:43) [13]


> Ega23 ©   (16.01.09 19:33) [11]
Это в защиту сабжа или против? :)


 
Anatoly Podgoretsky ©   (2009-01-16 19:48) [14]

Так этот код

> try
> if WorkDoneWell then
>   result := CONST_OK
> else
>   result := CONST_NOT;
> exit;
> except
> end;
> result := CONST_EXCEPTION;

равен этому
result := CONST_EXCEPTION;


 
oxffff ©   (2009-01-16 19:51) [15]


> Anatoly Podgoretsky ©   (16.01.09 19:48) [14]


Почему?

try
raise Exception.Create("none");
if TRUE then showmessage("CONST_OK")
else showmessage("NOT");
exit;
except
end;
showmessage("EXCEPTION");
end;

Закоментируйте и раскоментируйте
raise Exception.Create("none");


 
oxffff ©   (2009-01-16 19:54) [16]


> Юрий Зотов ©   (16.01.09 19:16) [8]
> > oxffff ©   (16.01.09 18:34) [7]
> > Все правомерно!!!
>
> Только кривовато немного, вот так посимпатичнее будет:
>
> try
>  if WorkDoneWell then
>    result := CONST_OK
>  else
>    result := CONST_NOT;
> except
>  result := CONST_EXCEPTION;
> end;


Я в большинстве своего кода, именно так и пишу.
Просто мне всегда интересно найти сходную альтернативу.


 
Ega23 ©   (2009-01-16 20:04) [17]


> Anatoly Podgoretsky ©   (16.01.09 19:48) [14]
>
> Так этот код
>

try
if WorkDoneWell then
  result := CONST_OK
else
  result := CONST_NOT;
exit;
except
end;
result := CONST_EXCEPTION;


> равен этому


result := CONST_EXCEPTION;


 
test   (2009-01-16 20:10) [18]

А логи пишут только трусы? А обработка ошибок отменена указом президента?


 
oxffff ©   (2009-01-16 20:16) [19]


> test   (16.01.09 20:10) [18]
> А логи пишут только трусы?


Нет, только майки.


 
_слонярка   (2009-01-16 20:17) [20]

> TURSCmdMngr.OnAccUsrChangePwd2
кризис в действии? стараетесь лишний раз не стирать клавиши на клавиатуре? :)


 
Anatoly Podgoretsky ©   (2009-01-16 20:18) [21]

> Anatoly Podgoretsky  (16.01.2009 19:48:14)  [14]

Извиняюсь, рабочий, не заметил кое что, но даже в этом коде можно result := CONST_EXCEPTION; перенести выше и except будет уже не пустой, так что данный код не может быть аргументом.


 
b z   (2009-01-16 20:29) [22]


> А обработка ошибок отменена указом президента?
Вот проссматривая наткнулся:
- "вся маета от привычки считать возбужденный эксепшен ошибкой"
тут http://delphimaster.net/view/15-1231979318/ [88]


 
oxffff ©   (2009-01-16 20:30) [23]


> Anatoly Podgoretsky ©   (16.01.09 20:18) [21]
> > Anatoly Podgoretsky  (16.01.2009 19:48:14)  [14]
>
> Извиняюсь, рабочий, не заметил кое что, но даже в этом коде
> можно result := CONST_EXCEPTION; перенести выше и except
> будет уже не пустой, так что данный код не может быть аргументом.
>


Почему?
+
Есть например [7]  с учетом [12].


 
oxffff ©   (2009-01-16 20:45) [24]

Еще например пример из моего кода.
try
   try
   ....

   if TRUE then showmessage("CONST_OK") else showmessage("NOT");
   except
   result:=const_EXCEPTION;
//Делаем вещи по обработке исключения, но они могут привести к другому исключению.
//или просто  raise;
   end;
except
end;


Внешний пустой try\except глотает все неизвестное.


 
Anatoly Podgoretsky ©   (2009-01-16 20:46) [25]

> oxffff  (16.01.2009 20:30:23)  [23]

Я про конкретный, а не про все варианты. В конкретном нет разницы между

except
end;
result := CONST_EXCEPTION;

и

except
result := CONST_EXCEPTION;
end;

И мне второй вариант приятнее, не говоря уже об верхних строках.


 
oxffff ©   (2009-01-16 20:51) [26]


> Anatoly Podgoretsky ©   (16.01.09 20:46) [25]


Тогда  [24], либо [7]+[12].


 
Anatoly Podgoretsky ©   (2009-01-16 20:54) [27]

> oxffff  (16.01.2009 20:45:24)  [24]

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


 
Добежал   (2009-01-16 21:01) [28]

блин, народ понес свои примеры...
Но все таки, господа, я бы хотел рассмотреть свой пример :))

Если код:

try
Window:=Document.parentWindow;
Window.before_print_script;
except ;
end;


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


 
oxffff ©   (2009-01-16 21:05) [29]


> Anatoly Podgoretsky ©   (16.01.09 20:54) [27]
> > oxffff  (16.01.2009 20:45:24)  [24]
>
> Вот это другое, похоже кусок сервера или служды, но я бы
> не стал делать пустым,
а включил бы управляемое логирование.
>


Я естестенно пишу, как [7],[8],[10],[24] в зависимости от ситуации.
Я придерживаюсь простой для меня истины, есть разные способы решения.
Но не один.


 
oxffff ©   (2009-01-16 21:08) [30]


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


Посылай с такими утверждениями на ....
Думай своей головой.


 
Mystic ©   (2009-01-16 21:12) [31]

> Добежал   (16.01.09 21:01) [28]

Я уже отвечал в > Mystic ©   (16.01.09 18:06) [4]. В теле except должно быть тип исключения, который ты хочешь игнорировать.


 
Eraser ©   (2009-01-16 21:20) [32]

догматизм это не есть хорошо )


 
test   (2009-01-16 21:48) [33]

Eraser ©   (16.01.09 21:20) [32]
Хаскел изучаем?

oxffff ©   (16.01.09 20:45) [24]
У тебя произошла ошибка неизвестно где и программа продолжила свой ход, если это Hello world да и черт с ним, если что то сложнее то что то надо делать кроме ;


 
Petr V. Abramov ©   (2009-01-16 22:11) [34]


> Добежал   (16.01.09 17:48)  

программа будет тихо не открывать документ. на первый, второй, третий, N-й раз, пока юзер не выйдет из себя и: 1. не выкинет программу в корзину 2. не напишет гневный мейл/звонок/тираду на совещании
А если б except вообще бы не было, был был вопль в рабочем порядке, и проблема решилась бы if`ом.
Ясное дело, что проблема не в юзерах и не в except, а в трансляции OLE-ексептиозов в дельфайные


 
DVM ©   (2009-01-16 22:15) [35]


> Ганя   (16.01.09 17:51) [1]
>
> По хорошему, такие ситуации надо разруливать не try-except"
> ом, а IF"ом
> IF before_print_script_Exists then ...

try except для того и придуман в частности, чтобы не плодить эти самые if then и не захламлять ими код. Место возникновения ошибки отделено от места ее обработки.

Так что хочешь try..except хочешь if then, хочешь их вместе. Все едино. Кому как нравится.

Лично я не вижу ничего зазорного в пустом except. Или в таком:

try
 n := strtoint(s);
except
 n := 0;
end;


 
Владислав   (2009-01-16 22:21) [36]

Да "все банально до тривиальности".

Программист "А" пишет плохой "код А":

try
Window:=Document.parentWindow;
Window.before_print_script;
except ;
end;


Через пару месяцев программист "Б" пишет плохой "код Б", дорабатывая "код А":

try
Window:=Document.parentWindow;
Window.adjust_print_script;
Window.before_print_script;
except ;
end;


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

Ну и ясен пень, "виноват программист Б"?..

При написании кода нужно добавлять еще одно измерение - Время.

Или придерживаться принципа - подтер себе, убери за товарищем?..

Впрочем, такой код можно писать, если после компиляции исходники уничтожаются - и писать просто, и поддерживать не нужно.


 
test   (2009-01-16 22:39) [37]

Владислав   (16.01.09 22:21) [36]
Вот ты счас серьезно или ради красного словца?


 
Игорь Шевченко ©   (2009-01-16 22:45) [38]

Владислав   (16.01.09 22:21) [36]


> Впрочем, такой код можно писать, если после компиляции исходники
> уничтожаются - и писать просто, и поддерживать не нужно.
>


Исходники надо уничтожать всегда. Иногда лучше до написания


 
oxffff ©   (2009-01-16 22:50) [39]


> test   (16.01.09 21:48) [33]
>
> oxffff ©   (16.01.09 20:45) [24]
> У тебя произошла ошибка неизвестно где и программа продолжила
> свой ход, если это Hello world да и черт с ним, если что
> то сложнее то что то надо делать кроме ;


Ты внимательно код смотрел?

Значит давай разберем.

У тебя есть некоторые операции, которые могут привести к исключению и детерминированно установить такой исход ты не в состоянии.
Однако есть требование не вылетать при этой операции.
И логировать кривой ее исход. При противодействии исключению операции, логированиии, ты же понимаешь, что противодействии исключению, логирование - это такая же операция, как и другие, и она также может вызвать исключение. Особенно, если код делегирован некоторому контракту(логирование в файл, логирование в БД, логирование по E-mail).

Тогда ты делаешь так.

try
  try
  ....

  if TRUE then showmessage("CONST_OK") else showmessage("NOT");
  except
  result:=const_EXCEPTION;

//Здесь ты противодействуешь исключению, пытаешься восттановить состояние, логируешь кривой исход операции.
//или просто  raise;
  end;
except
//Это для того, когда ничего не помогло, а работать надо дальше.
end;

Теперь тебе понятно?

P.S. Только приехал с больнички, ездил обогреватель отвозил,
у нас -30.


 
test   (2009-01-16 22:58) [40]

oxffff ©   (16.01.09 22:50) [39]
Ошибка она видимо неустранимо в принципе? Логирование оно не может работать в принципе? Не стандартные ситуации не предсказуемы?



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

Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.044 c
2-1233895829
des
2009-02-06 07:50
2009.03.29
Как отловить ошибку 405?


15-1231814498
Kerk
2009-01-13 05:41
2009.03.29
Медицина


2-1233919607
Alexxxx
2009-02-06 14:26
2009.03.29
положение scrollbar


15-1232336105
Slider007
2009-01-19 06:35
2009.03.29
С днем рождения ! 17 января 2009 суббота


1-1207988879
Timoha
2008-04-12 12:27
2009.03.29
Ярлыки в Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский