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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поговорим про исключения 
:(
    Опции темы
Alexeis
Дата 29.10.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Ребят, а вот насчет вложенных исключений. В можно ли в С++ защищенные секции вкладывать друг в друга? Чтобы отрабатывать корректно  исключения. 
  Например в делфях я могу написать так
Код

try 
  F := TFileStream.Create('mt.txt', fmOpenReadWrite);
  try
   F.read(s[1], 17);  
   F.Free;
  except 
    ShowMessage('ошибка чтения файла');   
    F.Free;
  end;
Except
 ShowMessage('ошибка доступа к файлу');
end;





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 29.10.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(archimed7592 @  29.10.2007,  11:24 Найти цитируемый пост)
Видел. К чему всё это? К тому что бывают исключения про которые "забыли"?

А что произойдет, например, при обращении к уже удаленному объекту, из-за какой-нибудь ошибки. Даже если ты знаешь как это событие перехватить, то как потом его обрабатывать? Единственный вменяемый способ - не обрабатывать такое исключение, а пропустить его, чтоб оно дошло до самого до main-a  smile .
Цитата(archimed7592 @  29.10.2007,  11:24 Найти цитируемый пост)
И то, что в этом случае помогут ссылки на "предыдущие" исключения? Хорошо, допустим... Осталось понять как они помогут и по какому принципу они предыдущие и следующие? 

Вложенные исключения нужны для того что-бы определить первоначальный источник исключения, наверное:
Код

try
{
} catch (const std::exception* except)
{
 if (можем продолжить)
 {
   *****
 } else
      throw new myexception(except);//обычно здесь пишут throw;
}

разница в том, что исключение сохраняет информацию о всех обработчиках, в которых оно было перехвачено
вам оно надо, мне лично нет 


Это сообщение отредактировал(а) Lazin - 29.10.2007, 16:54
PM MAIL Skype GTalk   Вверх
archimed7592
Дата 29.10.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  29.10.2007,  11:47 Найти цитируемый пост)
  Ребят, а вот насчет вложенных исключений. В можно ли в С++ защищенные секции вкладывать друг в друга? Чтобы отрабатывать корректно  исключения. 
  Например в делфях я могу написать так

Да, конечно.

Цитата(Lazin @  29.10.2007,  12:41 Найти цитируемый пост)
А что произойдет, например, при обращении к уже удаленному объекту, из-за какой-нибудь ошибки. Даже если ты знаешь как это событие перехватить, то как потом его обрабатывать? Единственный вменяемый способ - не обрабатывать такое исключение, а пропустить его, чтоб оно дошло до самого до main-a  smile .

Ну эт очевидно, по моему smile.

Цитата(Lazin @  29.10.2007,  12:41 Найти цитируемый пост)
Вложенные исключения нужны для того что-бы определить первоначальный источник исключения, наверное:
...
...
вам оно надо, мне лично нет 

Мне тоже не надо smile.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Lazin
Дата 29.10.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alexeis @  29.10.2007,  11:47 Найти цитируемый пост)
  Ребят, а вот насчет вложенных исключений. В можно ли в С++ защищенные секции вкладывать друг в друга? Чтобы отрабатывать корректно  исключения. 
  Например в делфях я могу написать так

Можно, но только возможностей немного больше, в этом-то и проблема, возможностей дофига, и пользоваться ими можно поразному, но не все из того что можно есть гут
PM MAIL Skype GTalk   Вверх
akizelokro
Дата 29.10.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Возвращаясь к заявленной теме. В идеале каждую программу нужно делать как отказоустойчивую. На практике этого добиться не удается очень часто ( читай, - практически всегда). Но есть программы с требованиями повышенной "плавучести". В идеале, С++ должен предоставить для программиста соответствующие возможности. С наиболее простым вариантом - одиночным исключением все понятно. Исключение возбуждено, обработчик перехватил его, обработал, принял "соответствующие" меры и передал управление в программу (без аварийного завершения). Но, посмотрим, как все может произойти (обязательно произойдет) на практике. В блоке try - catch исключение. Прежде чем оно передается в блок catch(ESomeExceprion e), освобождаются локальные переменные. Для объектов вызываются их деструкторы. Я могу прописать в деструктор некоего объекта дополнительные действия помимо освобождения памяти. Например, возвращая контекст некоего устройства в прежнее состояние. Что происходит с обработкой предыдущего исключения, если в этот момент возбуждается новое?

Это сообщение отредактировал(а) akizelokro - 29.10.2007, 15:51


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 29.10.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  29.10.2007,  15:51 Найти цитируемый пост)
Что происходит с обработкой предыдущего исключения, если в этот момент возбуждается новое?

Вызывается std::terminate(), который в свою очередь std::abort().

Добавлено через 1 минуту и 34 секунды
Так что про "старое" исключение можно забыть, как и про всю программу.
Читаем классиков: деструктор не должен выпускать исключений!


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.10.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(akizelokro @  29.10.2007,  15:51 Найти цитируемый пост)
Что происходит с обработкой предыдущего исключения, если в этот момент возбуждается новое?

  ИМХО зависит от самого блока catch, прежнее прервется, обработается новое, если нет своего перехватчика, то обработка предыдущего должна прерваться, если есть то продолжиться после окончания вложенного перехватчика.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 29.10.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Alexeis, читай выше - если во время отмотки стека вывалится ещё одно исключение, то вывалится вся прога.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.10.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



archimed7592, если внутри catch сделать еще одну защищенную секцию, дальше если внутри этой вложенной секции опять возникнет исключение, что неужели не сработает catch это вложенной секции?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
akizelokro
Дата 29.10.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

ИМХО зависит от самого блока catch, прежнее прервется, обработается новое, если нет своего перехватчика, то обработка предыдущего должна прерваться, если есть то продолжиться после окончания вложенного перехватчика. 

Здесь мне не все ясно. В книгах описания ситуации я не встречал. Но судя по принципам обработки, в этом случае получается ерунда. Второе исключение возбуждено в пределах try{}, оно "пропиливает" стэк, продолжая освобождать еще не освобожденные локальные объекты. После раскрутки стэка и перехвата исключения выполнение программы должно по идее перейти к следующей за try-catch блоком инструкции. Если же программа возвращается к обработке первичного исключения, то (предположу), что вновь будет предпринята попытка "раскрутки" стэка с непредсказуемыми последствиями smile . Стэк уже единожды раскручен?
Также, где хранится "значение" для первичного исключения? В вершине стэка? 


Это я рассматриваю тот случай, когда на каждое из двух исключений есть свой обработчик, не завершающий выполнение программы. Либо catch(...) не отфутболивает с помощью throw() исключение по цепочке.

Это сообщение отредактировал(а) akizelokro - 29.10.2007, 16:30


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 29.10.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  29.10.2007,  16:16 Найти цитируемый пост)
archimed7592, если внутри catch сделать еще одну защищенную секцию, дальше если внутри этой вложенной секции опять возникнет исключение, что неужели не сработает catch это вложенной секции?

На примере понятней будет?
Код

#include <ostream>
#include <iostream>
struct A
{
     ~A()
     {
         throw 1;
     }
};

int main()
{
     try
     {
         A a;
         throw 2;
     }
     catch(int e)
     {
         std::cout << e << std::endl;
     }
}

Код

archimed7592@PC ~/testlabs/g++
$ g++ ./main.cpp

archimed7592@PC ~/testlabs/g++
$ ./a.exe

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

archimed7592@PC ~/testlabs/g++
$


Добавлено через 3 минуты и 2 секунды
Цитата(akizelokro @  29.10.2007,  16:23 Найти цитируемый пост)
Здесь мне не все ясно.
бла-бла-бла...

Тебе цитату из стандарта привести, где написано что будет, если во время раскрутки стека вывалится исключение?
Чё демагогию разводить то?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 29.10.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

Тебе цитату из стандарта привести, где написано что будет, если во время раскрутки стека вывалится исключение?

Приведи. Я еще учебник не одолел, так что мне стандарт штудировать еще рано. А учитывая количество литературы, в которой я закопался, и то, что мою работу с меня никто не снимал, просто нет времени.  smile 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Alexeis
Дата 29.10.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



archimed7592, я не вижу чтобы строчка 
Цитата(archimed7592 @  29.10.2007,  16:42 Найти цитируемый пост)
 std::cout << e << std::endl;

Была в защищенной секции...

Добавлено через 1 минуту и 36 секунд
типа такого
Код

#include <ostream>
#include <iostream>
struct A
{
     ~A()
     {
         throw 1;
     }
};
int main()
{
     try
     {
         A a;
         throw 2;
     }
     catch(int e)
     {
       try
       {
         std::cout << e << std::endl;
       }
       .........
     }
}

вот тогда что произойдет?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 29.10.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alexeis @  29.10.2007,  16:03 Найти цитируемый пост)
ИМХО зависит от самого блока catch, прежнее прервется, обработается новое, если нет своего перехватчика, то обработка предыдущего должна прерваться, если есть то продолжиться после окончания вложенного перехватчика. 

Возможно Alexeis, имел ввиду следующее:
Код

try
{
   throw -1;
} catch (const int& except) {
 try {
  printf("exception code %d", except);
  throw;
 } catch (...) 
 {
   printf("...");
 }
}

млин, он меня опередил 0_o

Это сообщение отредактировал(а) Lazin - 29.10.2007, 17:01
PM MAIL Skype GTalk   Вверх
JackYF
Дата 29.10.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Alexeis @  29.10.2007,  16:54 Найти цитируемый пост)
std::cout << e << std::endl;

если здесь возникнет исключение, тогда std::terminate().


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1355 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.