Условия несрабатывания try except

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

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

Условия несрабатывания try except

Сообщение NTFS » 11.03.2013 09:26:09

Добрый день.

Столкнулся с проблемой. Пишу безопасное серверное приложение. Вылизанный код основного модуля, где все 99% надежно, и произвольный перегружаемый метод, где может и рвануть Access Violation.

По наивности, думал, что использование конструкции

Код: Выделить всё
try
   MainServerMethod()
except
   on E:Exception do
      ..
end
FinalServerMethod()

должно при любом раскладе (если я не использую вызовы dll в MainServerMethod) дать мне безопасное выполнение. Т.е, FinalServerMethod выполнится всегда.

Но!!! уже три раза, внутри MainServerMethod (да, там сложная структура, много классов, обращение к БД и прочее) возникает Access Violation и программа ПАДАЕТ

Есть ли какие-то условия, при которых try except не срабатывает?
Думал на Runtime Error, но при подключении модуля SysUtils они по-любому преобразуются в Exception

Весь сервер - один exe файл. DLL на FreePascal давно не делаю, это мертвый номер. Но тут выясняется, что и в одном исполнимом файле может быть веселье.

Среда компиляции: FPC 2.6.2, Linux32
Среда выполнения: Linux32
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Условия несрабатывания try except

Сообщение Sergei I. Gorelkin » 11.03.2013 11:34:12

Представь себе повреждение кучи, например такое, что вызов EAccessViolation.Create будет приводить к повторному нарушению доступа к памяти. То же самое касается повреждений стека. Наконец, если даже удалось создать и объект исключения и начать раскрутку стека, то по ходу дела будет выполняться код из блоков finally, который может натворить что угодно, прежде чем управление попадет в нужный блок except.

Так что использование try..except абсолютно ничего не гарантирует.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Условия несрабатывания try except

Сообщение NTFS » 11.03.2013 11:39:27

Решение? Не хочется писать сервер на Java или C++, там это можно обеспечить, но я их не люблю и не умею готовить.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Условия несрабатывания try except

Сообщение SSerge » 11.03.2013 12:01:41

NTFS писал(а):там это можно обеспечить


Ой ли?
На жабке от таких проблем может быть и спасет автоматический сборщик, виртуальная машина, и то, что сам язык многих безобразий не позволяет, но вот для С++ описанную ситуацию сотворить куда легче, чем в freepascal. То, что описывает Sergei I. Gorelkin в принципе верно для любого компилируемого [в машиный код] языка программирования. Общее зло, так сказать.
Последний раз редактировалось SSerge 11.03.2013 12:04:43, всего редактировалось 1 раз.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Условия несрабатывания try except

Сообщение Sergei I. Gorelkin » 11.03.2013 12:02:54

Решение может быть только одно: при ошибках типа access violation завершать процесс немедленно, попросив систему создать дамп памяти, потом по этому дампу искать и исправлять причину.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Условия несрабатывания try except

Сообщение NTFS » 11.03.2013 12:17:11

Ошибся, вместо С++ имел в виду C#, конечно.

Задача в общем случае такова: какое бы безобразие не происходило в методе MainMethod, всегда должен выполниться FinalMethod.

Добавлено спустя 3 минуты 16 секунд:
Оно, конечно, можно делать так:
Код: Выделить всё
#!/bin/sh

./prog_mainmethod
./prog_finalmethod


Но хотелось бы не подниматься до уровня консоли.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Условия несрабатывания try except

Сообщение Sergei I. Gorelkin » 11.03.2013 12:48:54

Разделение на процессы сработает, да. Его необязательно делать на уровне консоли, можно запускать процессы и из своей программы или, для Windows, пользоваться соответствующими механизмами COM (out-of-process server).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Условия несрабатывания try except

Сообщение xdsl » 03.04.2013 20:51:56

access violation точно не внутри FinalServerMethod() или позже?
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Условия несрабатывания try except

Сообщение NTFS » 03.04.2013 21:21:25

Однозначно внутри MainMethod.

Я проблему уже решил переходом на sh-скрипты, где сложные элементы логики оформлены в виде исполнимых файлов. Все-таки операционка в общем случае работает лучше, чем программа на FPC.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Условия несрабатывания try except

Сообщение xdsl » 03.04.2013 21:41:06

Н-да, даже и не понять, как воспроизвести. Вот такой код:
Код: Выделить всё
{$mode objfpc}
var p:^byte=nil;
begin
try p^:=1; except end;
writeln('handled');
end.

дает handled
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Условия несрабатывания try except

Сообщение SeZuka » 04.04.2013 04:30:21

А что вы ожидали получить?
Обработчик сработал, и дальше пошла программа выполняться после обработчика.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Условия несрабатывания try except

Сообщение xdsl » 04.04.2013 06:42:12

SeZuka писал(а):А что вы ожидали получить?
Обработчик сработал, и дальше пошла программа выполняться после обработчика.

Именно это и ожидал получить.

Пытаюсь понять, как можно смоделировать ситуацию, озвученную в начале треда: viewtopic.php?p=70482#p70482
Что надо написать вместо p^:=1, чтобы появился необработанный access violation? Пока ничего в голову не приходит.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Условия несрабатывания try except

Сообщение SeZuka » 04.04.2013 14:39:19

Не совсем понятно чего хотите. Но если вам хочется получить все-таки ошибку, тогда сделайте ее в обработчике.
Код: Выделить всё
{$mode objfpc}
var p:^byte=nil;
begin
try
p^:=1;
except
p^:=2;
end;
writeln('handled');
end.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Условия несрабатывания try except

Сообщение xdsl » 04.04.2013 17:43:13

Автор треда утверждает, что в его случае access violation, возникающий в блоке try, не обрабатывается в блоке except.

Мне хочется смоделировать такую ситуацию и убедиться, что такое вообще возможно. Вот что такое надо ухитриться сотворить в блоке try?
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Условия несрабатывания try except

Сообщение SeZuka » 05.04.2013 04:50:06

xdsl писал(а):Автор треда утверждает, что в его случае access violation, возникающий в блоке try, не обрабатывается в блоке except.

Автор утверждает что у него не срабатывает FinalServerMethod который идет после except .. end так что возможно что ошибка в самом обработчике.
Лет 10 назад делал один крупный проект на дельфи, в нем был один общий обработчик, который писал в лог в файл и делал снимки экрана во время ошибки. Так вот была такая ситуация, когда при любой ошибке программа полностью вылетала с AV, оказалось что программу запускали из сетевой папки на которой стоял запрет на запись. В итоге при ошибке программа пыталась записать лог с изображением, но не могла этого сделать и получала еще одну ошибку уже в самом обработчике except .. end и после этого полностью падала.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

След.

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

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

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

Рейтинг@Mail.ru