Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 961

/ вопрос открыт /

Здравствуйте, эксперты!
У меня почему-то не работают инструкции такого вида:
try
выражение с возможной ошибкой;
except on EAccessViolation do showmessage('MyError');
end;
Приложение завершается аварийно. Что-то в опциях компилятора (Delphi 2009) включить или отключить нужно ?

Сергей П. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Сергей П. (статус: Посетитель)
Вопрос отправлен: 3 октября 2008, 15:16
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, Сергей П.!
Если запускаете приложение из под Delphi, то так и будет. Отладчик перехватывает исключения. Чтобы отключить этот перехват (что не сильно рекомендуется, поскольку могут быть и другие ошибки), надо зайти в
опции Debugger (к сожалению где в Delphi2009 находится эта вкладка не знаю), а в Delphi 6 на вкладку
Language Exceptions и убрать галочку в checkbox StopOnDelphiExceptions. Либо попробуйте запустить приложение из Windows без Delphi

Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 3 октября 2008, 15:25


Мини-форум вопроса

Всего сообщений: 18; последнее сообщение — 3 октября 2008, 20:51; участников в обсуждении: 4.
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 15:38 [#1]:

Убрал аналогичную галочку у себя. Теперь сообщения об ошибке нет, только звук "критической ошибки" и из под Delphi и из Windows. Программа все равно завершается аварийно.
Feniks

Feniks (статус: Бакалавр), 3 октября 2008, 15:42 [#2]:

А зачем вы пытаетесь именно EAccessViolation поймать ? Или, если вам надо поймать любое исключение, то уберите эти строки и оставте только:
try
// чего-нибудь
except
   ShowMessage('MyError');
end;
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 16:42 [#3]:

А потому что именно EAccessViolation только может появиться, но дело в том что, что не лови - не ловит.
Feniks

Feniks (статус: Бакалавр), 3 октября 2008, 16:48 [#4]:

А вот и не только EAccessViolation может быть. Существует целый класс исключительных ошибок.
Тогда приводите свой полный код. Посмотрим что там не так. :))
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 17:01 [#5]:

var CityCodes : Array of integer;
...........
SetLength(CityCodes,CityCount);
...........
procedure TForm1.ChangeFlashInformer;
var
Astr : string;
dwConnectionTypes: DWORD;
begin
if InternetGetConnectedState(@dwConnectionTypes,0) then
begin
try
Astr:=IntToStr(CityCodes[RibbonComboBox2.Items.IndexOf(RibbonComboBox2.Text)]);
except// on EAccessViolation do showmessage('MyError');
showmessage('MyError');
end;
if Length(Astr)=4 then Astr:=StringOfChar('0',5-Length(Astr))+Astr;
ShockwaveFlash1.Movie:='http://img.gismeteo.Ru/flash/fw120x60.swf?index='+Astr;
ShockwaveFlash1.Visible:=True;
ShockwaveFlash1.Play;
end
else
begin
ShockwaveFlash1.Stop;
ShockwaveFlash1.Visible:=False;
Timer2.Enabled:=True;
end;
end;

В случае если RibbonComboBox2.Text = '' то появляется ошибка
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 17:09 [#6]:

Поправка
if Length(Astr)<5 then Astr:=StringOfChar('0',5-Length(Astr))+Astr;

Прошу прощения - проблемы у провайдера, перезашел с телефона, могу пропадать.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 3 октября 2008, 17:55 [#7]:

Если RibbonComboBox2.Text = '' , то, скорее всего IndexOf() возвращает отрицательное значение из-за этого и ошибка. Надо не try except использовать, а предотвратить возникновение ошибки, поставив проверку, чтобы при text='' обрабатывалась данная ситуация
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 18:13 [#8]:

Я так и сделал (пока). Просто для работы программы нужен (и есть) текстовый файл, в котором все по определенному формату прописано. И если пользователь туда руками полезет, то программа начнет ломаться в разных частях (в зависимости от того что пользователь "подправил"). Вот и хотел чтобы не отслеживать, что он там наменял (вариантов много) и не вставлять по всему коду проверки на разные несоответствия, поставить перед фактом ShowMessage('Поменял ? До свидания !'). Т.е. проверять не все возможные ошибки в каждой процедуре, а один раз с помощью try except. А компилятор так не хочет.
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 18:26 [#9]:

И еще, TForm1.ChangeFlashInformer вызывается из процедуры, в которой есть такой фрагмент

procedure TForm1.SitiesListCreate;
......
if CityCount<=0 then
begin
ShowMessage('В списке должен быть хотя бы один город');
Application.Terminate;
end;
.....

Так я сначала хотел сообщать об ошибке, но так как TForm1.SitiesListCreate вызывается из Form1.Create, то программа хочет доделать все что там прописано, и не обращает внимания на Application.Terminate. Вернее обращает но после того как все выполнит, в том числе и код где ошибка появляется.
Вадим К

Вадим К (статус: Академик), 3 октября 2008, 19:03 [#10]:

Application.Terminate в Form1.Create не может просто физически отработать - объект Application просто ещё не настроен. попробуйте в наглую давать halt(1); хотя это и очень грубо.
Надо просто переписать нормально код.
По поводу проверок. А прийдётся их проставлять! без этого никак. правда можно установить общий обработчик на ошибки и генерировать исключения.
тогда код такой будет
if (что то не так) then raise exception.create('бай-бай');
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 19:12 [#11]:

Так если я все условия возникновения ошибки предусмотрю, хотя это наверно не возможно, то для чего тогда конструкция try except ?
Почему она не работает ?
Вадим К

Вадим К (статус: Академик), 3 октября 2008, 19:42 [#12]:

она работает. просто Вы не умеете её пользоваться:)
А ошибки не надо "предусматривать". надо просто нормально обрабатывать. Не надеятся, что в 2 позиции в 5 строке будет цифра. А взять и проверить.
Да, парсинг файлов- тяжёлое дело. Но потом привыкаешь и всё просто.

Я обычно делаю так. У меня есть одна процедура, которая загружает файл. Только в одном месте, я не разношу на сотню мест загрузку.
И эту процедуру в месте вызова заключаю в try except
И у меня не возникает подобных вопросов.
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 3 октября 2008, 19:44 [#13]:

да, подсказка. Если в процедуре нет блока try except, то происходит так называемая раскрутка стека. То есть происходит досрочный выход с процедуры/функции. Если и в вышестоящей нет защитного блока, то ещё выше. Процедуры обработки нажатия кнопок и другие события имеют этот блок неявно.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 20:23 [#14]:

Мне кажется у меня проблема именно в том что вообще эта конструкция не работает. Специально уже деление на 0 туда запихал, а реакции от try except нет.
Вадим К

Вадим К (статус: Академик), 3 октября 2008, 20:29 [#15]:

ну не может так быть. код в студию
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 20:35 [#16]:

В другом фрагменте кода всё работает, а в этом, который здесь обсуждается нет. Чем то в нем не так.
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 20:36 [#17]:

А код выше выкладывал, именно в нем не работает.
Сергей П.

Сергей П. (статус: Посетитель), 3 октября 2008, 20:51 [#18]:

Все, всем спасибо, разобрался. Не в том месте Application.Terminate стояло, и не давало моему сообщению появиться.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.03 сек.