-
Возникали споры, правомерно ли в некоторых случаях оставлять тело 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 низачто нельзя оставлять пустым, есть противо аргументы? Интересно.
-
По хорошему, такие ситуации надо разруливать не try-except' ом, а IF'ом IF before_print_script_Exists then ...
-
> Или у приверженцев теории, что except низачто нельзя оставлять > пустым, есть противо аргументы? Интересно.
Ты тролль ?
-
> По хорошему, такие ситуации надо разруливать не try-except' > ом, а IF'ом
ну я тоже об этом думал. Но судя по всему в данной ситуации хрен это проверишь.
-
Все равно исключение должно иметь свой тип. И исключение ловить только на вызов, где оно может возникнуть. Так что лучше написать
Window:=Document.parentWindow;
try
Window.before_print_script;
except
on E: EOleError do ;
end;
-
try adoconnection.open(); Result := True; except try adoconnection.open('user','password'); result := True; except on E:Exceptiuon do .... end; end
В контексте вопроса верхний блок - пустой. и все логично.
-
в параметрах подключения кнопка для adodb.prompdatasource и возможность ввести имя пароль.
я не знаю, какая строка подключения будет у юзера. с паролем и именем или с использованием nt аутентификации.
если без нт, я не хочу парсить ее и вставлять логин/пароль. и не хочу допустим сохранять ее в настройках с паролем.
отсюда такой двуступенчатый try/except
и пустой верхний блок
-
> Добежал (16.01.09 17:48) > Возникали споры, правомерно ли в некоторых случаях оставлять > тело except пустым
Все правомерно!!!
result:=CONST_EXCEPTION; try ........... IF WorkDoneWell then result:=CONST_OK else result:=CONST_NOT; except end;
-
> 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 пустой просто не возникает. :о)
-
> при правильном кодинге необходимость оставлять секцию except > пустой просто не возникает
ну тогда как "правильно" переписать пример? try
Window:=Document.parentWindow;
Window.before_print_script;
except ;
end; Ведь здесь как видно секция except пустая оказалась.
-
> Юрий Зотов © (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;
-
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;
-
> Юрий Зотов © (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 процедуру.
-
> Ega23 © (16.01.09 19:33) [11] Это в защиту сабжа или против? :)
-
Так этот код > try > if WorkDoneWell then > result := CONST_OK > else > result := CONST_NOT; > exit; > except > end; > result := CONST_EXCEPTION;
равен этому result := CONST_EXCEPTION;
-
> 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');
-
> Юрий Зотов © (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;
Я в большинстве своего кода, именно так и пишу. Просто мне всегда интересно найти сходную альтернативу.
-
> 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 (16.01.09 20:10) [18] > А логи пишут только трусы?
Нет, только майки.
|