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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принимаем объект исключения по ссылке или значению, Где почитать более детальней 
:(
    Опции темы
Lazin
Дата 4.7.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



доходит smile 
PM MAIL Skype GTalk   Вверх
xvr
Дата 4.7.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Не доходит до деструктора Obj1 потому что ломается на поиске соотвествующего catch. Тот, что есть, не ловит, так как наследование Exc1 от BaseExc приватное, и приведение типов в ловушке не производится.
Напиши 
Код

class Exc1 : public BaseExc
и все заработает

PM MAIL   Вверх
Lazin
Дата 4.7.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xvr @  4.7.2009,  21:43 Найти цитируемый пост)
Не доходит до деструктора Obj1 потому что ломается на поиске соотвествующего catch. Тот, что есть, не ловит, так как наследование Exc1 от BaseExc приватное, и приведение типов в ловушке не производится.

Цитата

ObjMain creating...
Obj1()
ObjMain()
BaseExc()
Exc1()
~ObjMain()
~Obj1()
???

Добавлено через 14 секунд
код не менял
PM MAIL Skype GTalk   Вверх
xvr
Дата 5.7.2009, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Код не менял -

Код

ObjMain creating...
Obj1()
ObjMain()
BaseExc()
Exc1()

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


Код менял -
Код

ObjMain creating...
Obj1()
ObjMain()
BaseExc()
Exc1()
~Obj1()
BaseExc()
Exc2()

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

Студия 2003

PS. У тебя вообще поддержка исключений включена?


Это сообщение отредактировал(а) xvr - 5.7.2009, 00:32
PM MAIL   Вверх
Lazin
Дата 5.7.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xvr @  5.7.2009,  00:30 Найти цитируемый пост)
У тебя вообще поддержка исключений включена?

включена - /EHsc
студия - 2008
PM MAIL Skype GTalk   Вверх
zim22
Дата 5.7.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(xvr @  4.7.2009,  21:43 Найти цитируемый пост)
Не доходит до деструктора Obj1 потому что ломается на поиске соотвествующего catch

MSVC 2008 ругается
Код

~Obj1() { 
    cout << "~Obj1()" << endl;
    throw Exc2();
  }

warning C4722: 'Obj1::~Obj1' : destructor never returns, potential memory leak

код не менял, доходит только до Exc1()
исключения включены - /EHsc
***
gcc тоже только до Ex1 доходит

Это сообщение отредактировал(а) zim22 - 5.7.2009, 11:35


--------------------
PM MAIL   Вверх
xvr
Дата 5.7.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(zim22 @ 5.7.2009,  10:13)
код не менял, доходит только до Exc1()
исключения включены - /EHsc

'Аналогичн' © Следствие ведут Колобки
Lazin колись, почему у тебя доходит  smile 
Уж до ~ObjMain() по любому доходить не должно - исключение из деструктора Obj1 должно было срубить программу раньше однозначно!

Если еще закоментировать throw Exc2(); в деструкторе Obj1 и добавить ключ /GR при компиляции (для поддержки RTTI), то получим
Код

ObjMain creating...
Obj1()
ObjMain()
BaseExc()
Exc1()
~Obj1()
class type: class Exc1
~Exc1()
v ~BaseExc()
что и ожидалось

PM MAIL   Вверх
Lazin
Дата 5.7.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xvr @  5.7.2009,  11:23 Найти цитируемый пост)
Если еще закоментировать throw Exc2(); в деструкторе Obj1 и добавить ключ /GR при компиляции (для поддержки RTTI)

именно, а разве в студии эта опция не включена по умолчанию?
PM MAIL Skype GTalk   Вверх
xvr
Дата 5.7.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Lazin @ 5.7.2009,  13:05)
Цитата(xvr @  5.7.2009,  11:23 Найти цитируемый пост)
Если еще закоментировать throw Exc2(); в деструкторе Obj1 и добавить ключ /GR при компиляции (для поддержки RTTI)

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

Возможно, я компилировал с коммандной строки, там она по умолчанию не включена

PM MAIL   Вверх
EvilsInterrupt
Дата 6.7.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Читая дальше Страуструпа про "Спецификации исключений", обнаружил еще одно непонятное явление:


Код

#include <iostream>

/*----------------------------------------------------------------------------*/
using std::cout;
using std::endl;
/*----------------------------------------------------------------------------*/
class Exc2
{
public:
  Exc2() { cout << "Exc2()" << endl;  }
  virtual ~Exc2() { cout << "~Exception2()" << endl; }
};

class Exc1
{
public:
  Exc1() { cout << "Exc1()" << endl; }
  virtual ~Exc1() { cout << "~Exc1()" << endl; }
};

void  F1()  throw(Exc1)
{
  cout << "F1()" << endl;
  throw Exc1();
}

void  F2()  throw(Exc2)
{
  cout << "F2()" << endl;
  F1();
}
/*----------------------------------------------------------------------------*/
int main()
{
  try 
  {
    F2();
  }
  catch(Exc2& e)
  {
    cout << "Class type: " << typeid(e).name() << endl;
    return(1);
  }
  return(0);
}


Вопрос, в F2 сказано что генирит только и только Exc2 , но в F1, которую она вызывает генерится Exc1 , так почему не вызывается unexpected() ?

---
Гы, а сейчас вызывается этот unexpected() , только почему не вызывался, не пойму! Использую MS Visual Studio 2008 TS

Это сообщение отредактировал(а) EvilsInterrupt - 6.7.2009, 12:16
PM MAIL WWW ICQ Jabber   Вверх
Lazin
Дата 6.7.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



компилятор студии ведет себя здесь не так как положено по стандарту, если ф-я имеет не пустую спецификацию исключений, то она может кидать любое исключение и unexpected не вызовется, нормально работают только пустые спецификации исключений
PM MAIL Skype GTalk   Вверх
EvilsInterrupt
Дата 21.7.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Продолжаю эксперементировать дальше, стандарт по С++ говорит что std::exception это базовый класс. Для меня базовый это тот класс, реализацию которого осуществляют в потомках, но вот есть код:

Код

#include <iostream>
#include <stdexcept>

/*----------------------------------------------------------------------------*/
using std::cout;
using std::endl;
/*----------------------------------------------------------------------------*/

int main(int argc, char ** argv)
{
  try
  {
    throw std::exception("std::exception");
  }
  catch(std::exception& e)
  {
    cout << "Exception text: " << e.what() << endl;
    return(1);
  }
  cout << "Exception not generated" << endl;
  return(0);
}


В этом коде, объект std::exception успешно создается! Но почему ? Если этот базовый, то не должно ведь!
PM MAIL WWW ICQ Jabber   Вверх
bsa
Дата 21.7.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Попробуй это собрать на компиляторе, который более соответствует стандарту:
Код
#include <exception>
int main()
{
        throw std::exception("test");
}
Код
$ g++ test.cpp
aaa.cpp: In function ‘int main()’:
aaa.cpp:4: ошибка: нет подходящей функции для вызова ‘std::exception::exception(const char [5])’
/usr/include/c++/4.3/exception:59: замечание: претенденты: std::exception::exception()
/usr/include/c++/4.3/exception:57: замечание:              std::exception::exception(const std::exception&)


Добавлено через 1 минуту и 6 секунд
EvilsInterrupt, пользуйся std::runtime_error или другими стандартными исключениями, если они тебе подходят.

Добавлено через 7 минут и 42 секунды
Цитата(EvilsInterrupt @ 21.7.2009,  23:35)
Для меня базовый это тот класс, реализацию которого осуществляют в потомках

В корне не верное утверждение. Базовый - это класс, который был унаследован. И не важно, реализует ли наследник что-то или нет.
Существует понятие абстрактного класса - класс, у которого хотя бы один метод объявлен абстрактным (реализация может присутствовать). Нельзя создать экземпляр подобного класса. Можно создать только экземпляр потомка, который реализует (наследует реализацию) всех абстрактных методов.
PM   Вверх
EvilsInterrupt
Дата 22.7.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



bsa, 
Цитата

EvilsInterrupt, пользуйся std::runtime_error или другими стандартными исключениями, если они тебе подходят.

Да я еще думаю над вопросом "А что мне подходит ?" ;)
1)
Хочу ловить разнообразные bad_alloc, ну и др. полезные исключения, а это означет использование потомков exception или насколько понял std::exception, пока еще не понял в чем их различие.
2)
Насколько понимаю есть, которые произошли не по вине программы, к примеру сеть обрубили или свет выключили и коннекта с модемом нет и это runtime_error, а есть логические, к примеру некорректно вычислилась зарплата и введено большое входнойчисло, а на старте процесса вычисления невозможно было сразу проверить, тогда это logic_error

но что делать если ошибки такие:
- открытие файла
- создание файла
- чтение из файла
- запись в файл
- выделение памяти для внутреннего кэша

Казалось бы все они логические, но разве от программы зависит открытие файла ? Это операционка решает открыть или нет!
PM MAIL WWW ICQ Jabber   Вверх
EvilsInterrupt
Дата 23.7.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



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

class error_iolib : public std::exception;

а уж от error_iolib порождать error_io_read, error_io_write, etc , даже не смотнря нато что ошибка при выделении буфера близка к bad_alloc , все равно лучше создать error_io_cashe . Думаю такой подход не нарушит концептуальной целостности библиотеки и будет понятно, что к чему относится.

Вообще, хочется знать у кого какие мысли и опыт в построении иерархий исключений для библиотек.
PM MAIL WWW ICQ Jabber   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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