Обработка исключений free_pascal
Модератор: Модераторы
Обработка исключений free_pascal
Добрый день уважаемое содружество)
Я не специалист по freepascal, поэтому не пинайте сильно)
Возникла следующая проблема: делается GUI приложение, при возникновении в нем исключения (любого) выскакивает MessageBox с адресами функций и программа закрывается.
Нужно заменить этот стандартный обработчик, что-бы он не выводил адреса, а просто сообщение об ошибке и закрывал программу. Такое желание заказчика((
знаю что фрипаскальная rtl - опенсорс, но ни как не могу найти нужную процедуру. Помогите пожалуста...
Или может какие другие есть идеи на эту тему?
Я не специалист по freepascal, поэтому не пинайте сильно)
Возникла следующая проблема: делается GUI приложение, при возникновении в нем исключения (любого) выскакивает MessageBox с адресами функций и программа закрывается.
Нужно заменить этот стандартный обработчик, что-бы он не выводил адреса, а просто сообщение об ошибке и закрывал программу. Такое желание заказчика((
знаю что фрипаскальная rtl - опенсорс, но ни как не могу найти нужную процедуру. Помогите пожалуста...
Или может какие другие есть идеи на эту тему?
Это делается так же, как и в Дельфи - потенциально опасный участок кода окружается try .. exception. Например, если Вы загружаете в компонент типа TMemo текстовый файл, то можно смело предположить, что самого файла может и не быть. В таком случае код, который загружает файл, нужно подстраховать с помощью try:
Хочу сразу предупредить - окружать всю программу try .. exception занятие очень сомнительное. Лучше ещё раз прошерстить код и выявить опасные участки и подумать, почему там могут возникнуть исключения. После исправления козявок программа падать перестанет и заказчик будет Вам век благодарен.
Код: Выделить всё
Try
memo1.Lines.LoadFromFile('какой-то файл');
exception
ShowMessage('Ая-яй! Файл открыть не удалось...');
end;Хочу сразу предупредить - окружать всю программу try .. exception занятие очень сомнительное. Лучше ещё раз прошерстить код и выявить опасные участки и подумать, почему там могут возникнуть исключения. После исправления козявок программа падать перестанет и заказчик будет Вам век благодарен.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Vadim, не всегда стоит использовать исключения -- зачастую, они просто мешают думать программисту. Лучше стараться сразу писать программы обрабатывающие нештатные ситуации на месте.
не знаю как будет работать под разными ос но под винду можно сделать так .
кидаешь на главную форму ApplicationProperties
и пишешь код в в OnEception
по идее должно помочь с любыми ошибками.
кидаешь на главную форму ApplicationProperties
и пишешь код в в OnEception
Код: Выделить всё
procedure TForm1.ApplicationProperties1Exception(Sender: TObject; E: Exception);
begin
application.terminate;
end;
по идее должно помочь с любыми ошибками.
Vadim писал(а):Хочу сразу предупредить - окружать всю программу try .. exception занятие очень сомнительное.
Это правильное занятие, во всяком случае в ОС с SEH.
Лекс Айрин писал(а): Лучше стараться сразу писать программы обрабатывающие нештатные ситуации на месте.
Само название "исключительная ситуация" уже говорит само за себя. Например, любая ошибка ввода пользователя к таковым не относится, а вот ошибка при чтении какого-нибудь файла вполне.
DYUMON писал(а):ApplicationProperties
и пишешь код в в OnEception
Можно просто использовать событие OnException глобального объекта Application, туда попадают все необработанные исключения.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail писал(а): а вот ошибка при чтении какого-нибудь файла вполне.
Не факт. Это тоже вполне себе нормальное событие. И его тоже можно обработать. Если, конечно, не идет сбой на физическом уровне. И даже в этом случае можно либо просто закрыть файл, либо сохранить открытое под другим именем. Впрочем, многие слишком часто пользуются механизмом исключений.
Mikhail писал(а):Это правильное занятие, во всяком случае в ОС с SEH.
Вообще-то стандартный обработчик создаваемый компилятором еще никто не отменял.
Vadim писал(а): то можно смело предположить, что самого файла может и не быть.
А FileExists не пробовали применять?
Лекс Айрин писал(а):Не факт. Это тоже вполне себе нормальное событие. И его тоже можно обработать. Если, конечно, не идет сбой на физическом уровне.
От ситуации зависит, например, если читаете png файл чтобы загрузить изображение, а он оказывается "битым", то это исключительная ситуация. Если же Ваше приложение предназначено для работы с "битыми" файлами, то это штатная ситуация. Почти любой сбой IO это нештатная ситуация.
Лекс Айрин писал(а):Вообще-то стандартный обработчик создаваемый компилятором еще никто не отменял.
Да, но, насколько я понял, автора не устраивает стандартный обработчик, следовательно либо необходимо заключить всю программу в защищеенный блок либо переназначить стандартный обработчик исключений
Код: Выделить всё
System.ExceptProc- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail писал(а):Почти любой сбой IO это нештатная ситуация.
Да, но это не значит, что в программе его нельзя штатно обработать... поднимите раннюю справку по ТР... версии где-то 4-5... там ведь весь файловый ввод/вывод обрабатывается в программе, если это необходимо. Даже справочнике по шестой версии еще нет исключений.
Mikhail писал(а): либо переназначить стандартный обработчик исключений
Да, вот это сделать можно. И не так уж и сложно. Только вот где гарантия, что исключение не вызывается неправильно написанным кодом? Который придется когда-нибудь менять.
Лекс Айрин писал(а):Даже справочнике по шестой версии еще нет исключений.
В TP вообще нет исключений, так что тут просто нечего обсуждать...
Лекс Айрин писал(а):Да, но это не значит, что в программе его нельзя штатно обработать...
Что значит штатно обработать?
Лекс Айрин писал(а):Только вот где гарантия, что исключение не вызывается неправильно написанным кодом?
Нет таких гарантий и никогда не будет. Но причем здесь это?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail писал(а):В TP вообще нет исключений, так что тут просто нечего обсуждать...
угу... но почему-то все прекрасно обрабатывалось.
Mikhail писал(а):Что значит штатно обработать?
как минимум, не гася программу.
Mikhail писал(а):Но причем здесь это?
Я еще ни разу не нашел ситуации, которую нельзя отработать без исключений, хотя стандартно ими в этих случаях все пользуются. Чуть изменяешь код и все. А ведь стандартная обработка зачастую заключается в легкой подчистке хвостов и возврата обратно в программу. Если же встревает стандартный обработчик, то программа просто тупо завершается.
На низком уровне, обработчик это прерывание ОС, которое для своей работы требует слишком больших накладных расходов.
Mikhail писал(а):Нет таких гарантий и никогда не будет.
Вообще-то такие гарантии можно дать, если использовать специальные методы написания и верификации кода. Только зачем, если есть обработчики? А ведь их функционал многие используют не полностью и неверно.
Кстати, в описанной выше ситуации я просто создаю новый файл, если он не существует.
Лекс Айрин писал(а):А FileExists не пробовали применять?
Надеюсь, это вопрос философский?
В одном с Вами согласен - с текстовым файлом пример не совсем удачен. Но как пример вполне сойдёт.
Лекс Айрин писал(а):угу... но почему-то все прекрасно обрабатывалось.
Исключения?
Лекс Айрин писал(а):как минимум, не гася программу.
Погасить программу это тоже штатное поведение, как и синий экран в Windows, если что.
Лекс Айрин писал(а):Я еще ни разу не нашел ситуации, которую нельзя отработать без исключений, хотя стандартно ими в этих случаях все пользуются.
Да, некоторые ими пользуются там где не нужно. Обойтись можно и вообще без исключений только кодами ошибок... можно, но зачем?
Лекс Айрин писал(а):На низком уровне, обработчик это прерывание ОС, которое для своей работы требует слишком больших накладных расходов.
Не всегда, но оверхед есть. Кстати, что такое прерывание ОС?
Лекс Айрин писал(а):Вообще-то такие гарантии можно дать, если использовать специальные методы написания и верификации кода.
Пра-а-а-авда?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Vadim, и что, что он битый? У меня, что на компе, что на телефоне битые файлы прекрасно открываются, что позволяет, при необходимости, его пересохранить, обрезав испорченные моменты. (для графики). С видео похуже, но тоже не столь фатально для программы -- достаточно закрыть испорченный файл (программа при этом, как ни странно, даже остается работать). ini файл, при необходимости, просто удаляется и/или пересохраняется на стандартные значения.
Вот только не факт, что речь идет о работе с файлами и даже, что речь о памяти. Боюсь, речь о неправильном понимании работы компилятора. Для которого, например, неполный if ущербен по определению. Это, кстати, касается и некоторых других операторов.
Вот только не факт, что речь идет о работе с файлами и даже, что речь о памяти. Боюсь, речь о неправильном понимании работы компилятора. Для которого, например, неполный if ущербен по определению. Это, кстати, касается и некоторых других операторов.
cli Механизм исключений сделан, в частности, и для Вас. Он позволяет не "ронять" программу как было раньше в DOS (чпок и черный экран, а дальше Ctrl+Alt+Del).
Если ваша программа будет от каждого чиха выдавать "исключение" после которого закрываться, спасибо Вам заказчик не скажет. Вы должны, как грамотный программист, сами предугадать появление исключения и обработать ситуацию до того как система вас мордой в батарею сунет. Таких ситуаций множество. Например, деление на ноль, квадратный корень из отрицательного числа, попытка чтения несуществующего файла, попытка ткнуться в нулевой указатель, .... Их уйма. Вы должны сами выполнить проверку, и принять решение что делать дальше. Системная обработка исключения не приветствуется. Есть случаи конечно, но лучше самому IF-ами все сделать.
Простейший пример - в цикле что-то делаете и на основе исключения принимаете решение что делать дальше. У вас такие жуткие тормоза включатся!!! что никого не устроят. И примеров таких уйма.
Если ваша программа будет от каждого чиха выдавать "исключение" после которого закрываться, спасибо Вам заказчик не скажет. Вы должны, как грамотный программист, сами предугадать появление исключения и обработать ситуацию до того как система вас мордой в батарею сунет. Таких ситуаций множество. Например, деление на ноль, квадратный корень из отрицательного числа, попытка чтения несуществующего файла, попытка ткнуться в нулевой указатель, .... Их уйма. Вы должны сами выполнить проверку, и принять решение что делать дальше. Системная обработка исключения не приветствуется. Есть случаи конечно, но лучше самому IF-ами все сделать.
Простейший пример - в цикле что-то делаете и на основе исключения принимаете решение что делать дальше. У вас такие жуткие тормоза включатся!!! что никого не устроят. И примеров таких уйма.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail писал(а):Исключения? Мой совет, насчет мат. части остается в силе.
Вам шашечки или ехать?
Mikhail писал(а):Погасить программу это тоже штатное поведение, как и синий экран в Windows, если что.
угу... это позиция страуса. В большинстве случаев совсем не обязательно ласты клеить. И, кстати, как раз за эту привычку я и не люблю форточки.
Mikhail писал(а): Обойтись можно и вообще без исключений только кодами ошибок... можно, но зачем?
Хотя бы затем чтобы уменьшить проблемы с программой. Ведь исключение не всегда правильно может работать с остальным кодом.
Mikhail писал(а):Не всегда, но оверхед есть.
Не может этого быть. Скорее, лично Вы его просто не замечаете.
Mikhail писал(а):Кстати, что такое прерывание ОС?
А это, как раз, вызов служебных функций и обработка исключений методами операционной системы (которые зачастую программа перехватывает).
Mikhail писал(а):Пра-а-а-авда?
Как лично Вам это не покажется странным, но это правда. Минимальное следование этим правилам позволило исключить ошибки в программе как класс. Они появляются так редко, что я всегда могу понять как их не допустить в следующий раз. Другое дело, что это замедляет ее написание, но позволяет всегда иметь практически работоспособную программу.
Добавлено спустя 2 минуты 59 секунд:
vada писал(а):Есть случаи конечно, но лучше самому IF-ами все сделать.
Вот именно так я и стараюсь поступать. И при написании пошагово проверять каждую ситуацию, которая может возникнуть. Очень, кстати, дисциплинирует.
