Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синтаксис try..except..end, Выполнить в except on и функции 
V
    Опции темы
Zlo
Дата 23.7.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Суть в том что нужно в блоке 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 то компилятор не ругается. А как совместить?

Это сообщение отредактировал(а) Zlo - 23.7.2013, 19:30
PM MAIL   Вверх
kami
Дата 23.7.2013, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Код

on ... do
  begin

  end;

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

Это сообщение отредактировал(а) kami - 23.7.2013, 19:48
PM MAIL WWW   Вверх
Zlo
Дата 23.7.2013, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Сделал так:
Код

      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. 
PM MAIL   Вверх
kami
Дата 23.7.2013, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



хммм. мда?  Странно smile 

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

Код

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

Увидел? то, что в begin..end ни коим боком не относится к обработке исключения. Вот компилятор и ругается.
PM MAIL WWW   Вверх
Zlo
Дата 23.7.2013, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



kami
Тогда уж так:
Код

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

Но мне нужно чтоб было отдельно от on..do и выполнялось не зависимо от типа ошибки
PM MAIL   Вверх
kami
Дата 23.7.2013, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



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

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

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


PM MAIL WWW   Вверх
Zlo
Дата 23.7.2013, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



 только когда возникнет ошибка
PM MAIL   Вверх
kami
Дата 23.7.2013, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Continue - все равно убрать. При выходе из except-блока цикл все равно пойдет на следующий виток.
а вот .Next имхо, придется добавлять в каждый on..do обработчик. 
Хотя в данном случае, имхо, можно обойтись одним e: Exception и выводить ShowMessage(e.ToString)
PM MAIL WWW   Вверх
northener
Дата 24.7.2013, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Poseidon
Дата 24.7.2013, 09:26 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(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.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
northener
Дата 25.7.2013, 02:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Poseidon
Дата 25.7.2013, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(northener @  25.7.2013,  02:06 Найти цитируемый пост)
И настолько уже привык, что begin на пустой строке я воспринимаю только как начало программы/процедуры.
begin без пробелов перед ним - начало процедуры, с пробелами - логическая секция. Всегда так было, стиль написания кода, который заложен в делфийских модулях, считается стандартом. Да, каждый пишет как привык и как хочет, но выдавать свой личный стиль написания за правильный со словами "тогда уж так" - это грубо. Почему-то вы не ставите begin на один уровень с procedure и function. Получается при таком виде нет стандарта, куда хочу, туда леплю. Посмотрите код не стандартных, но более-менее серьезных проектов на Delphi. Jedi, VirtualTreeView и им подобных. Нигде не используется такой стиль обрамления логической секции. Вот, почитайте (кратко на русском). Старожилов вроди 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;



Это сообщение отредактировал(а) Poseidon - 25.7.2013, 09:38


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
superVad
Дата 25.7.2013, 10:34 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Оставлю это здесь - ссылка  и еще ссылка.
Хотя, думаю, что многие уже читали.
PM MAIL   Вверх
Zlo
Дата 30.7.2013, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



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

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

PM MAIL   Вверх
superVad
Дата 31.7.2013, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Zlo, тебе ответили в первом же предложении. Другое дело, что нету всего кода - но есть подозрения, что Next и Continue могут быть лишними или можно как то организовать по другому.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0969 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.