Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Синтаксис try..except..end


Автор: Zlo 23.7.2013, 19:29
Суть в том что нужно в блоке except записать скажем ошибку в лог, а потом еще переместить указатель и начать новую итерацию цикла.
В общем если делать так:

Код

for I := 1 to Count-1 do begin
    try
    peremen1:=TESTfunction(peremen2);
    except

      on E:EOleException do
        ShowMessage('ERROR'+E.Message+'  '+IntToStr(E.ErrorCode));
      on E:Exception do
        ShowMessage('ERROR'+E.Classname+':'+E.Message);

        SQLite_table.Next;
        Continue;
    end;
end;


то компилятор ругается на  две строчки
Код

SQLite_table.Next;
        Continue;


Если убрать конструкции on..do то компилятор не ругается. А как совместить?

Автор: kami 23.7.2013, 19:46
Код

on ... do
  begin

  end;

но в данном случае Continue - лишнее. Да и Next все равно надо вынести за пределы try..except (если этого не делается в TESTfunction. А если делается - то убрать оттуда).

Автор: Zlo 23.7.2013, 19:51
Сделал так:
Код

      on E:EOleException do
        ShowMessage('ERROR'+E.Message+'  '+IntToStr(E.ErrorCode));
      on E:Exception do
        ShowMessage('ERROR'+E.Classname+':'+E.Message);
        begin
        SQLite_table.Next;
        Continue;
        end;

Тогда ругается на begin. 

Автор: kami 23.7.2013, 19:56
хммм. мда?  Странно smile 

Почитай про составные операторы - будет полезно. А пока - засунь ShowMessage туда же, под begin. И еще - крайне полезно бывает пользоваться автоматическим форматированием кода. Если им воспользоваться, то код будет выглядеть так:

Код

on E:Exception do
  ShowMessage('ERROR'+E.Classname+':'+E.Message);
begin
  SQLite_table.Next;
  Continue;
end;

Увидел? то, что в begin..end ни коим боком не относится к обработке исключения. Вот компилятор и ругается.

Автор: Zlo 23.7.2013, 20:07
kami
Тогда уж так:
Код

on E:Exception do begin
  ShowMessage('ERROR'+E.Classname+':'+E.Message);
  SQLite_table.Next;
  Continue;
end;

Но мне нужно чтоб было отдельно от on..do и выполнялось не зависимо от типа ошибки

Автор: kami 23.7.2013, 20:08
Цитата(Zlo @  23.7.2013,  20:07 Найти цитируемый пост)
Но мне нужно чтоб было отдельно от on..do и выполнялось не зависимо от типа ошибки

Выполнялось всегда, или только когда возникнет ошибка?

Добавлено через 1 минуту и 10 секунд
Подозреваю, что всегда. В этом случае:
Цитата(kami @  23.7.2013,  19:46 Найти цитируемый пост)
Continue - лишнее. Да и Next все равно надо вынести за пределы try..except (если этого не делается в TESTfunction. А если делается - то убрать оттуда).


Автор: Zlo 23.7.2013, 20:15
 только когда возникнет ошибка

Автор: kami 23.7.2013, 20:31
Continue - все равно убрать. При выходе из except-блока цикл все равно пойдет на следующий виток.
а вот .Next имхо, придется добавлять в каждый on..do обработчик. 
Хотя в данном случае, имхо, можно обойтись одним e: Exception и выводить ShowMessage(e.ToString)

Автор: northener 24.7.2013, 00:24
Цитата(kami @  23.7.2013,  20:31 Найти цитируемый пост)
можно обойтись одним e: Exception и выводить ShowMessage(e.ToString

Не во всех версиях Дельфи класс Exception имеет такой метод. Почему-то о весьма значительной полезности такого метода подумали ну очень не сразу!

Автор: Poseidon 24.7.2013, 09:26
Цитата(Zlo @ 23.7.2013,  20:07)
kami
Тогда уж так:
Код

on E:Exception do begin
  ShowMessage('ERROR'+E.Classname+':'+E.Message);
  SQLite_table.Next;
  Continue;
end;

Кто тебя этому научил? Ставить begin "где-то там", а end в начале строки - ой как не красиво. kami дал правильный пример форматирования. Посмотри стандартные модули, тот же sysutils, там везде begin на одном уровне с end.

Автор: northener 25.7.2013, 02:06
Цитата(Poseidon @  24.7.2013,  09:26 Найти цитируемый пост)
Кто тебя этому научил? Ставить begin "где-то там", а end в начале строки - ой как не красиво.

Я его этому не учил. smile
Но и я так же пишу.
Возможно эта традиция тянется из того же времени что и опция редактора Турбо Паскаля Optimal Fill.
И настолько уже привык, что begin на пустой строке я воспринимаю только как начало программы/процедуры.

Автор: Poseidon 25.7.2013, 09:32
Цитата(northener @  25.7.2013,  02:06 Найти цитируемый пост)
И настолько уже привык, что begin на пустой строке я воспринимаю только как начало программы/процедуры.
begin без пробелов перед ним - начало процедуры, с пробелами - логическая секция. Всегда так было, стиль написания кода, который заложен в делфийских модулях, считается стандартом. Да, каждый пишет как привык и как хочет, но выдавать свой личный стиль написания за правильный со словами "тогда уж так" - это грубо. Почему-то вы не ставите begin на один уровень с procedure и function. Получается при таком виде нет стандарта, куда хочу, туда леплю. Посмотрите код не стандартных, но более-менее серьезных проектов на Delphi. Jedi, VirtualTreeView и им подобных. Нигде не используется такой стиль обрамления логической секции. http://jvcl.delphi-jedi.org/StyleGuide.htm (http://citforum.ru/programming/delphi/style_delphi/). Старожилов вроди northener уже не перестроишь smile, но новичкам будет полезно.

Цитата

A continuation line should never start with a binary operator. Avoid breaking a line where normally no white space appears, such as between a method name and its opening parenthesis, or between an array name and its opening square bracket. If you must break under these circumstances, then one viable place to begin is after the opening parenthesis that follows a method name. Never place a begin statement on the same line with any other code.

 

Examples:

Код

 
// INCORRECT
while (LongExpression1 or LongExpression2) do begin
  // DoSomething
  // DoSomethingElse;
end;

// CORRECT
while (LongExpression1 or LongExpression2) do 
begin
  // DoSomething
  // DoSomethingElse;
end;


Автор: superVad 25.7.2013, 10:34
Оставлю это здесь - http://www.gunsmoker.ru/2010/07/blog-post.html и еще http://www.gunsmoker.ru/2011/01/blog-post.html.
Хотя, думаю, что многие уже читали.

Автор: Zlo 30.7.2013, 11:01
Все почему-то  пишут, что я begin не там леплю, на ошибку никто даже не посмотрел.  smile 
Ну да ладно вопрос был совсем в другом.
Цитата(kami @  23.7.2013,  20:31 Найти цитируемый пост)
Хотя в данном случае, имхо, можно обойтись одним e: Exception и выводить ShowMessage(e.ToString) 

Спасибо. Пойдет.

Автор: superVad 31.7.2013, 12:34
Zlo, тебе ответили в первом же предложении. Другое дело, что нету всего кода - но есть подозрения, что Next и Continue могут быть лишними или можно как то организовать по другому.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)