Обработка исключений free_pascal

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Обработка исключений free_pascal

Сообщение cli » 04.11.2015 03:28:27

Добрый день уважаемое содружество)
Я не специалист по freepascal, поэтому не пинайте сильно)
Возникла следующая проблема: делается GUI приложение, при возникновении в нем исключения (любого) выскакивает MessageBox с адресами функций и программа закрывается.
Нужно заменить этот стандартный обработчик, что-бы он не выводил адреса, а просто сообщение об ошибке и закрывал программу. Такое желание заказчика((
знаю что фрипаскальная rtl - опенсорс, но ни как не могу найти нужную процедуру. Помогите пожалуста...
Или может какие другие есть идеи на эту тему?
cli
незнакомец
 
Сообщения: 5
Зарегистрирован: 04.11.2015 03:21:35

Re: Обработка исключений free_pascal

Сообщение Vadim » 04.11.2015 06:55:56

Это делается так же, как и в Дельфи - потенциально опасный участок кода окружается try .. exception. Например, если Вы загружаете в компонент типа TMemo текстовый файл, то можно смело предположить, что самого файла может и не быть. В таком случае код, который загружает файл, нужно подстраховать с помощью try:
Код: Выделить всё
Try
  memo1.Lines.LoadFromFile('какой-то файл');
exception
  ShowMessage('Ая-яй! Файл открыть не удалось...');
end;

Хочу сразу предупредить - окружать всю программу try .. exception занятие очень сомнительное. Лучше ещё раз прошерстить код и выявить опасные участки и подумать, почему там могут возникнуть исключения. После исправления козявок программа падать перестанет и заказчик будет Вам век благодарен. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Обработка исключений free_pascal

Сообщение Лекс Айрин » 05.11.2015 10:28:09

Vadim, не всегда стоит использовать исключения -- зачастую, они просто мешают думать программисту. Лучше стараться сразу писать программы обрабатывающие нештатные ситуации на месте.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Обработка исключений free_pascal

Сообщение DYUMON » 05.11.2015 10:47:22

не знаю как будет работать под разными ос но под винду можно сделать так .
кидаешь на главную форму ApplicationProperties
и пишешь код в в OnEception
Код: Выделить всё
procedure TForm1.ApplicationProperties1Exception(Sender: TObject; E: Exception);
begin
application.terminate;
end;

по идее должно помочь с любыми ошибками.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Обработка исключений free_pascal

Сообщение Mikhail » 05.11.2015 11:07:12

Vadim писал(а):Хочу сразу предупредить - окружать всю программу try .. exception занятие очень сомнительное.


Это правильное занятие, во всяком случае в ОС с SEH.


Лекс Айрин писал(а): Лучше стараться сразу писать программы обрабатывающие нештатные ситуации на месте.


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

DYUMON писал(а):ApplicationProperties
и пишешь код в в OnEception


Можно просто использовать событие OnException глобального объекта Application, туда попадают все необработанные исключения.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Обработка исключений free_pascal

Сообщение Лекс Айрин » 05.11.2015 11:39:42

Mikhail писал(а): а вот ошибка при чтении какого-нибудь файла вполне.

Не факт. Это тоже вполне себе нормальное событие. И его тоже можно обработать. Если, конечно, не идет сбой на физическом уровне. И даже в этом случае можно либо просто закрыть файл, либо сохранить открытое под другим именем. Впрочем, многие слишком часто пользуются механизмом исключений.

Mikhail писал(а):Это правильное занятие, во всяком случае в ОС с SEH.

Вообще-то стандартный обработчик создаваемый компилятором еще никто не отменял.

Vadim писал(а): то можно смело предположить, что самого файла может и не быть.

А FileExists не пробовали применять?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Обработка исключений free_pascal

Сообщение Mikhail » 05.11.2015 12:10:13

Лекс Айрин писал(а):Не факт. Это тоже вполне себе нормальное событие. И его тоже можно обработать. Если, конечно, не идет сбой на физическом уровне.


От ситуации зависит, например, если читаете png файл чтобы загрузить изображение, а он оказывается "битым", то это исключительная ситуация. Если же Ваше приложение предназначено для работы с "битыми" файлами, то это штатная ситуация. Почти любой сбой IO это нештатная ситуация.

Лекс Айрин писал(а):Вообще-то стандартный обработчик создаваемый компилятором еще никто не отменял.


Да, но, насколько я понял, автора не устраивает стандартный обработчик, следовательно либо необходимо заключить всю программу в защищеенный блок либо переназначить стандартный обработчик исключений
Код: Выделить всё
System.ExceptProc
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Обработка исключений free_pascal

Сообщение Лекс Айрин » 05.11.2015 12:23:33

Mikhail писал(а):Почти любой сбой IO это нештатная ситуация.

Да, но это не значит, что в программе его нельзя штатно обработать... поднимите раннюю справку по ТР... версии где-то 4-5... там ведь весь файловый ввод/вывод обрабатывается в программе, если это необходимо. Даже справочнике по шестой версии еще нет исключений.

Mikhail писал(а): либо переназначить стандартный обработчик исключений

Да, вот это сделать можно. И не так уж и сложно. Только вот где гарантия, что исключение не вызывается неправильно написанным кодом? Который придется когда-нибудь менять.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Обработка исключений free_pascal

Сообщение Mikhail » 05.11.2015 12:30:16

Лекс Айрин писал(а):Даже справочнике по шестой версии еще нет исключений.


В TP вообще нет исключений, так что тут просто нечего обсуждать...

Лекс Айрин писал(а):Да, но это не значит, что в программе его нельзя штатно обработать...


Что значит штатно обработать? :?

Лекс Айрин писал(а):Только вот где гарантия, что исключение не вызывается неправильно написанным кодом?


Нет таких гарантий и никогда не будет. Но причем здесь это?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Обработка исключений free_pascal

Сообщение Лекс Айрин » 05.11.2015 12:51:34

Mikhail писал(а):В TP вообще нет исключений, так что тут просто нечего обсуждать...

угу... но почему-то все прекрасно обрабатывалось.

Mikhail писал(а):Что значит штатно обработать?

как минимум, не гася программу.

Mikhail писал(а):Но причем здесь это?


Я еще ни разу не нашел ситуации, которую нельзя отработать без исключений, хотя стандартно ими в этих случаях все пользуются. Чуть изменяешь код и все. А ведь стандартная обработка зачастую заключается в легкой подчистке хвостов и возврата обратно в программу. Если же встревает стандартный обработчик, то программа просто тупо завершается.

На низком уровне, обработчик это прерывание ОС, которое для своей работы требует слишком больших накладных расходов.

Mikhail писал(а):Нет таких гарантий и никогда не будет.

Вообще-то такие гарантии можно дать, если использовать специальные методы написания и верификации кода. Только зачем, если есть обработчики? А ведь их функционал многие используют не полностью и неверно.

Кстати, в описанной выше ситуации я просто создаю новый файл, если он не существует.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Обработка исключений free_pascal

Сообщение Vadim » 05.11.2015 12:57:46

Лекс Айрин писал(а):А FileExists не пробовали применять?

Надеюсь, это вопрос философский? ;-) Пример с текстовым файлом - не более, чем пример. Михаил Вам правильно написал - файл то может и есть на месте, но битый. Так что его существование не говорит о том, что он откроется.
В одном с Вами согласен - с текстовым файлом пример не совсем удачен. Но как пример вполне сойдёт.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Обработка исключений free_pascal

Сообщение Mikhail » 05.11.2015 13:02:25

Лекс Айрин писал(а):угу... но почему-то все прекрасно обрабатывалось.


Исключения? :) Мой совет, насчет мат. части остается в силе.

Лекс Айрин писал(а):как минимум, не гася программу.


Погасить программу это тоже штатное поведение, как и синий экран в Windows, если что.

Лекс Айрин писал(а):Я еще ни разу не нашел ситуации, которую нельзя отработать без исключений, хотя стандартно ими в этих случаях все пользуются.


Да, некоторые ими пользуются там где не нужно. Обойтись можно и вообще без исключений только кодами ошибок... можно, но зачем? :?

Лекс Айрин писал(а):На низком уровне, обработчик это прерывание ОС, которое для своей работы требует слишком больших накладных расходов.


Не всегда, но оверхед есть. Кстати, что такое прерывание ОС? :roll:

Лекс Айрин писал(а):Вообще-то такие гарантии можно дать, если использовать специальные методы написания и верификации кода.


Пра-а-а-авда? :D :D :D
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Обработка исключений free_pascal

Сообщение Лекс Айрин » 05.11.2015 13:11:38

Vadim, и что, что он битый? У меня, что на компе, что на телефоне битые файлы прекрасно открываются, что позволяет, при необходимости, его пересохранить, обрезав испорченные моменты. (для графики). С видео похуже, но тоже не столь фатально для программы -- достаточно закрыть испорченный файл (программа при этом, как ни странно, даже остается работать). ini файл, при необходимости, просто удаляется и/или пересохраняется на стандартные значения.

Вот только не факт, что речь идет о работе с файлами и даже, что речь о памяти. Боюсь, речь о неправильном понимании работы компилятора. Для которого, например, неполный if ущербен по определению. Это, кстати, касается и некоторых других операторов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Обработка исключений free_pascal

Сообщение vada » 05.11.2015 13:21:13

cli Механизм исключений сделан, в частности, и для Вас. Он позволяет не "ронять" программу как было раньше в DOS (чпок и черный экран, а дальше Ctrl+Alt+Del).
Если ваша программа будет от каждого чиха выдавать "исключение" после которого закрываться, спасибо Вам заказчик не скажет. Вы должны, как грамотный программист, сами предугадать появление исключения и обработать ситуацию до того как система вас мордой в батарею сунет. Таких ситуаций множество. Например, деление на ноль, квадратный корень из отрицательного числа, попытка чтения несуществующего файла, попытка ткнуться в нулевой указатель, .... Их уйма. Вы должны сами выполнить проверку, и принять решение что делать дальше. Системная обработка исключения не приветствуется. Есть случаи конечно, но лучше самому IF-ами все сделать.
Простейший пример - в цикле что-то делаете и на основе исключения принимаете решение что делать дальше. У вас такие жуткие тормоза включатся!!! что никого не устроят. И примеров таких уйма.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Обработка исключений free_pascal

Сообщение Лекс Айрин » 05.11.2015 13:26:27

Mikhail писал(а):Исключения? Мой совет, насчет мат. части остается в силе.

Вам шашечки или ехать?

Mikhail писал(а):Погасить программу это тоже штатное поведение, как и синий экран в Windows, если что.

угу... это позиция страуса. В большинстве случаев совсем не обязательно ласты клеить. И, кстати, как раз за эту привычку я и не люблю форточки.

Mikhail писал(а): Обойтись можно и вообще без исключений только кодами ошибок... можно, но зачем?


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

Mikhail писал(а):Не всегда, но оверхед есть.

Не может этого быть. Скорее, лично Вы его просто не замечаете.

Mikhail писал(а):Кстати, что такое прерывание ОС?

А это, как раз, вызов служебных функций и обработка исключений методами операционной системы (которые зачастую программа перехватывает).

Mikhail писал(а):Пра-а-а-авда?

Как лично Вам это не покажется странным, но это правда. Минимальное следование этим правилам позволило исключить ошибки в программе как класс. Они появляются так редко, что я всегда могу понять как их не допустить в следующий раз. Другое дело, что это замедляет ее написание, но позволяет всегда иметь практически работоспособную программу.

Добавлено спустя 2 минуты 59 секунд:
vada писал(а):Есть случаи конечно, но лучше самому IF-ами все сделать.


Вот именно так я и стараюсь поступать. И при написании пошагово проверять каждую ситуацию, которая может возникнуть. Очень, кстати, дисциплинирует.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38

Рейтинг@Mail.ru
cron