Russian Qt Forum
Ноябрь 01, 2024, 10:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Почему не срабатывает блок try?  (Прочитано 24644 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #30 : Август 21, 2009, 13:02 »

ИМХО, нужно изначально писать так, чтобы отпала надобность в try.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #31 : Август 21, 2009, 13:19 »

Немного толку от перехвата общего "в программе произошла ошибка". Ну перехватили и что будете делать? Данные уже наверняка искалечены, остается показать окно с извинениями и выйти (да и то неизвестно живы ли еще окна).  Имеет смысл перехватывать на каком-то участке, для этого есть try catch на любой платформе. Хотя перехват обращения по неверному адресу и возможен, это ошибка в программе которую надо исправлять, а не перехватывать
Такое поведение подходит для офисных приложений.  Подмигивающий
А если процесс управляет чем-то серьезным? Извиниться и выйти...

Почему все данные должны быть искалечены? Часть - может быть, но не все!
Например, перехватив подобные сигналы, можно в обработчике, сохранить важные параметры и спокойно умереть, а процесс-контроллер получит сигнал, что один из дочерних процессов убит и перезапустит его. Дальше считываем сохраненные параметры и продолжаем работу.
Записан
Rcus
Гость
« Ответ #32 : Август 21, 2009, 13:31 »

А как вы узнаете что область памяти в которой хранятся ваши важные данные не испорчена уже? Улыбающийся Ошибки доступа к мертвым указателям такие, ага.
Записан
BRE
Гость
« Ответ #33 : Август 21, 2009, 13:40 »

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

А проверить валидность данных в блоке можно, например, по присутствию меток и сигнатур или подсчетом контрольных сумм....
Записан
a_n_y_a
Гость
« Ответ #34 : Август 21, 2009, 13:44 »

Вопрос решился таким образомм:

void term_handler(int i)
{
  printf ("Terminating\n");
  exit(EXIT_SUCCESS);
};

int main()
{
      struct sigaction sa;
      sigset_t newset;
      sigemptyset(&newset);
      sa.sa_handler = term_handler;
      sigaction(SIGSEGV, &sa, 0);

      A *a=0;
      a->b=5;
      a->Pokaz();
...   
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Август 21, 2009, 14:04 »

Вопрос решился таким образомм:

void term_handler(int i)
{
  printf ("Terminating\n");
  exit(EXIT_SUCCESS);
};

int main()
{
      struct sigaction sa;
      sigset_t newset;
      sigemptyset(&newset);
      sa.sa_handler = term_handler;
      sigaction(SIGSEGV, &sa, 0);

      A *a=0;
      a->b=5;
      a->Pokaz();
...   

Это будет работать и под Mac OSX. Но не на Вындоуз, так что говорить о кросс-платформенности не приходится
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #36 : Ноябрь 18, 2009, 17:15 »

Тем кому интересна эта тема, почитайте вот это - http://www.visualdata.ru/blog/109-segv-signal.html.

Возможность нормально транслировать SIGSEGV и SIGFPE в языковые исключения и потом их обрабатывать есть.
Записан

Гугль в помощь
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.