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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключения, class exception 
:(
    Опции темы
fear
Дата 18.5.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



class exception {
public:
   exception( ); 
   exception(const char *const&);
   exception(const char *const&, int);
   exception(const exception&); 
   exception& operator=(const exception&); 
   virtual ~exception( );
   virtual const char *what( ) const;
};
 

Что за тип такой const char *const&? Зачем такие сложности? 
PM MAIL   Вверх
Mayk
Дата 18.5.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Цитата(fear @  18.5.2006,  22:24 Найти цитируемый пост)
const char *const&?

Ссылка на константный указатель на константу насколько можно предположить.

Цитата(fear @  18.5.2006,  22:24 Найти цитируемый пост)
Зачем такие сложности?  

вопрос к автору кода(это не из стандартной библиотеки.). 
Простого указателя на константу должнно было бы хватить.

 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
nikitao
Дата 18.5.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


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

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



Цитата(fear @  18.5.2006,  19:24 Найти цитируемый пост)
 Зачем такие сложности? 

Это у создателя спросить надо  smile 
Цитата(fear @  18.5.2006,  19:24 Найти цитируемый пост)
Что за тип такой const char *const&?

Это вроде константная ссылка на константную строку, но могу ошибаться smile
 


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Fazil6
Дата 18.5.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



в данном случае константная строка и кроме того константный указатель на 1-й элемент. т.е. нельзя менять строку и указатель на нее. Зачем - это всетаки эксепшен. Может это  важно в каких-то реализациях 
PM MAIL   Вверх
MAKCim
Дата 18.5.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Может это  важно в каких-то реализациях  

не думаю, может просто идет какая-нибудь оптимизация, из-за этого, чтобы не копировать лишних 4 байта передается ссылка на указатель, но тогда адрес указателя можно было бы изменять, потому этот указатель - указатель-константа 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Бывалый
*


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

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



Цитата(MAKCim @ 18.5.2006,  19:11)
не думаю, может просто идет какая-нибудь оптимизация, из-за этого, чтобы не копировать лишних 4 байта передается ссылка на указатель, но тогда адрес указателя можно было бы изменять, потому этот указатель - указатель-константа

Спасибо за пояснение, ответ исчерпывающий.

Я только начал разбираться в обработке исключений, поэтому было бы интересно узнать кто как её реализует. Особенно былибы интересны примеры. Используются ли при этом классы стандартной библиотеки (какие?) или пишутся свои? Стоит ли наследовать свой класс исключений от std::exception? Кто какие в этом видет плюсы плюсы?  

Это сообщение отредактировал(а) fear - 18.5.2006, 23:29
PM MAIL   Вверх
DeadSoul
Дата 19.5.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 2
Всего: 11



1. Как отлавливать исключения. Возможные варианты
- по значению
Код

catch(MyException e)
{
}

ОЧЕНЬ плохо. Возможна "срезка", т.е. было выброшено MYExcException:public MyException и т.д.

2. По указателю:
Код

catch(MyException* e)
{
// надо ли писать delete e; ?
}

Вопрос в коде.

3. По ссылке(the best)
Код

catch(MyException& e)
{
}

Более подробно смотри у Саттера.


Цитата(fear @  18.5.2006,  23:28 Найти цитируемый пост)
Используются ли при этом классы стандартной библиотеки (какие?) или пишутся свои?

It depends.  К сожалению, std::exception не поддерживает юникодные строкиsmile
Общее требование: внутри одного проекта все классы исключений должны иметь один базовый(например, std::exception) 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 19.5.2006, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(DeadSoul @  19.5.2006,  01:07 Найти цитируемый пост)
Общее требование: внутри одного проекта все классы исключений должны иметь один базовый(например, std::exception)  

Ну, не стОит так жестко. Во-первых, это не всегда возможно. Например, если используешь и MFC и STL... Кроме того, бывает полезно в каких-то подзадачах ввести простые локальные исключения типа пустых структур:  struct _BadOp {};  
Главное - их во-время поймать и оттранслировать во что-то удобоваримое...
 


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


Эксперт
***


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

Репутация: 2
Всего: 11



Цитата(Earnest @  19.5.2006,  08:10 Найти цитируемый пост)
Например, если используешь и MFC и STL... 

Согласен.


Цитата(Earnest @  19.5.2006,  08:10 Найти цитируемый пост)
Кроме того, бывает полезно в каких-то подзадачах ввести простые локальные исключения типа пустых структур:  struct _BadOp {};  
Главное - их во-время поймать и оттранслировать во что-то удобоваримое...

ПОчему нельзя эти "пустые" исключения наследовать от одного базового?  


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
fear
Дата 21.5.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Сделал небольшую надстройку класса exception, что бы фиксировать номер ошибки.

Код

class MException :public std::exception
{
  public:
    MException();
    //MException(const char *const&);
    MException(const char *const&, const unsigned int *const&);

    const unsigned int *const& getErrorNumber();

  protected:
    const unsigned int *const& errorNum_;
};

MException::MException(const char *const& msg, const unsigned int *const& errorNum)
:exception(msg), errorNum_(errorNum)
{
  
}

const unsigned int *const& MException::getErrorNumber()
{
  return errorNum_;
}



Код

try
{
  throw MException("Hello MExeption", (const unsigned int *const)12);
}
catch(MException &e)
{
  out<<"Error:"<<e.getErrorNumber()<<" "<<e.what()<<endl;
}


Хотелось бы услышать замечания по приведённому выше коду. 
PM MAIL   Вверх
DeadSoul
Дата 21.5.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 2
Всего: 11



fear, зачем тебе номер ошибки? Ты пытаешься работать с исключениями как с кодами ошибок. Это нехорошо 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
fear
Дата 21.5.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(DeadSoul @ 21.5.2006,  12:05)
fear, зачем тебе номер ошибки? Ты пытаешься работать с исключениями как с кодами ошибок. Это нехорошо

Код ошибки - это для примера, 
моя программа представляет собой что-то вроде лексического анализатора, и мне нужно фиксировать номер строки, в которой произошла ошибка.
Программа простая, в случае ошибки должна завершаться. Организована она следующим образом:

Код

void main()
{
  try
  {
    // текст программы
    if(Error) throw MException();
    // текст программы
  }
  catch(MException &e)
  {
    cout<<"строка"<<x<<"Ошибка X"<<endl;
  }
}


Исключение будет содержать информацио о ошибке и месте её возникновения, с целью информирования пользователя.

DeadSoul, так использовать исключения хорошо?
Какие ещё есть классы исключений по типу std::exception в STL и BOOST?

Добавлено @ 15:11 
Цитата(fear @ 21.5.2006,  11:09)
throw MException("Hello MExeption", (const unsigned int *const)12);

Да, и почему если явно не указать тип для второго параметра, компилятор выдаёт ошибку, а для первого нет? 
PM MAIL   Вверх
MAKCim
Дата 21.5.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Какие ещё есть классы исключений по типу std::exception

std::bad_alloc (при неудачном выделении памяти new)
std::bad_cast (при приведении ссылок в dynamic_cast)
std::bad_typeid
std::bad_exception
std::out_of_range
std::range_error
...
и еще, зачем такой тип использовать?
Цитата

Код

 const unsigned int *const&


просто const unsigned int не катит?
Цитата

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

неявно привести целое к ссылке на указатель нельзя 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
DeadSoul
Дата 21.5.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 2
Всего: 11



Цитата(fear @  21.5.2006,  15:09 Найти цитируемый пост)
DeadSoul, так использовать исключения хорошо?

Ты показал как трогаешься со светофора и спрашиваешь хороший ли ты водитель.

Исключения - вещь безусловно вещь полезная. Сравни:
Код

// 1
bool Foo(A&a, B& b )
{
 if ( a.Foo1() )
  return false;

 if ( !b.Foo2() )
  return false;

  if ( !a.Foo3(b) )
   return false;
}

// 2
bool Foo(A&a, B& b )
{
 a.Foo1();// тут может вылететь исключение!

 b.Foo2();// и тут!

 a.Foo3(b);// и тут тоже!
}

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

Но использование исключение налагает некоторые требования на окружающий код(он должен быть exception safety)
Код

void Foo( A& a, int someSize)
{
  int* ptr=new int[someSize];

  a.Foo1( ptr, someSize );// Если эта функция выбросит исключение, то мы получим утечку памяти

 delete[] ptr;
}
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 22.5.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(DeadSoul @  20.5.2006,  00:47 Найти цитируемый пост)
Цитата(Earnest @  19.5.2006,  08:10 )
Кроме того, бывает полезно в каких-то подзадачах ввести простые локальные исключения типа пустых структур:  struct _BadOp {};  
Главное - их во-время поймать и оттранслировать во что-то удобоваримое...

ПОчему нельзя эти "пустые" исключения наследовать от одного базового?   

Да можно, конечно. Все это вопрос стиля и привычки. Просто я не люблю включать лишние файлы по пустякам. Если мне не надо передавать какие-то параметры в исключение, а важен только сам факт, причем ловлю я его локально и все равно транслирую в MFC - на кой мне наследоваться от std::exception?  


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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