Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Исключения


Автор: Jcs 29.1.2004, 09:04
Скажите, насколько часто вы используете исключения? Не добавляют ли они больше проблем, чем преимуществ (раздувание кода, быстродействие)? Или они должны использоваться только в самых крайних случаях? Стоит ли при их использовать, если возможна запись по нулевому поинтеру, или следует использовать обычную проверку (к примеру, при реализации пользовательского списка)? Заранее спасибо.

Автор: NiJazz 29.1.2004, 09:14
Цитата
Скажите, насколько часто вы используете исключения?

Как очевидно их преимущество.

Цитата
Не добавляют ли они больше проблем, чем преимуществ (раздувание кода, быстродействие)?

Нет. Наоборот - помогают их решить.

Исключения - это уже с появления ООП. То есть та же Windows работает не без них.

Автор: Vyacheslav 29.1.2004, 09:56
Обычная практика. С использованием исключений код становится более прозрачным и лаконичным

Автор: Vaulter 29.1.2004, 12:31
иключения по своей сути задумывались как упрощенная система отлова ошибок и обработки их...
ну и имхо очень удобная получилась система ) часто использую в больших программах, в мелких не имеет смысла.

Автор: RAN 29.1.2004, 14:26
Я программирую, основываясь на двух довольно удобных изобретениях в ООП - исключения и смарт-поинтеры. Первые позволяет легко генерировать и обрабатывать ошибки, а вторые, при этом, позволяют избежать утечек памяти. Всё это делает код очень понятным и небольшим.

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

Автор: Step 29.1.2004, 14:55
RAN, напиши статейку для факю "исключения и смарт-поинтеры"

Автор: RAN 29.1.2004, 15:32
Step, не раньше выходных. Но сделаю, раз считаете нужным.

Автор: Vyacheslav 29.1.2004, 15:35
Если кому интересно, вот дискуссия по данному вопросу, которая проходила на одном из форумов
http://borland.xportal.ru/forum/viewtopic.php?t=6613

Автор: Step 29.1.2004, 15:46
RAN, нужно, пиши и отправляй мне или любому модератору по факю с++...

Автор: C'hoosen++ 29.1.2004, 16:32
Я исключения использую редко, и действительно, чем больше программа,
тем больше используешь исключения.

Автор: Jcs 30.1.2004, 07:07
Можно ли задать пользовательский абстрактный тип исключения? Например, запись по нулевому указателю или по отрицательному индексу, чтобы далее генерировал их не сам юзер, а приложение?
Хотя в этом случае, наверное, язык уже будет высокоуровневым..

Автор: Vyacheslav 30.1.2004, 10:47
Что значит "не сам юзер, а приложение?". Исключение генерит всегда именно приложение, а не пользователь. И что такое "абстрактный тип исключения"?

Автор: NiJazz 30.1.2004, 11:19
Цитата
Исключение генерит всегда именно приложение, а не пользователь

Наверное, он имел в виду оператор throw.

Автор: Jcs 30.1.2004, 13:02
Я имею в виду возможность пользователя описать не конкретный случай исключительной ситуации, как например
Код

...
if(!ptr) throw null_ptr;
...

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

Автор: bel_nikita 30.1.2004, 15:41
Jcs
не совсем въехалsmile.gif, но по-ходу перегрузи оператор ->. И если идет обращение к нулевому поитеру генери исключение.

Автор: FreshMeat 30.1.2004, 16:18
Пара ссылок - разный взгляд на проблему:

http://www.joelonsoftware.com/items/2003/10/13.html
http://www.nedbatchelder.com/text/exceptions-vs-status.html
Вторая статья и ее обсуждение - просто супер

Взято здесь:
http://rsdn.ru/Forum/Message.aspx?mid=479157&only=1

Автор: Jcs 30.1.2004, 18:18
Судя по всему, такой возможности в С++ нет. Даже если рассудить логически, как ее реализовать, я - например, ума не приложу. Я наивно предполагал, что можно задать исключительную ситуацию, описать ее, и приложение будет само генерить исключение там, где такая ситуация возниакет, т.е. мне, как юзеру не придется делать проверку, что указатель нулевой и писать throw null_ptr, это за меня сделает компилятор. На самом же все придется проверять самому и генерить throw.
Но с другой стороны, в винде же это как-то реализовано... Т.е. определяет же система, что юзер долбится по нулевому адресу.
Может быть, конечно, это все можно реализовать на С++, но затраты будут несоизмеримы с премуществами.

Автор: bel_nikita 30.1.2004, 18:34
Цитата
Но с другой стороны, в винде же это как-то реализовано... Т.е. определяет же система, что юзер долбится по нулевому адресу.

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

Автор: Jcs 30.1.2004, 18:50
Да, это будет работать, но только для пользовательских типов, а как быть тогда с указателями на встроенные типы? К тому же проверять-то все равно придется. Можно, в принципе, создать какой-нить класс, который будет являться базовым для всех классов приложения, определить для него оный опрератор и запускать его во всех дочерних. Можно эмулировать также работу встроенных типов. Круто! Тогда нужно будет грамотно реализовать классовую иерархию, чтобы при добавлении нового исключения не переписывать все классы, но это уже проблемы другого плана. Спасибо за идею.

Автор: FreshMeat 2.2.2004, 13:00
Цитата(Jcs @ 30.1.2004, 18:18)
Судя по всему, такой возможности в С++ нет. Даже если рассудить логически, как ее реализовать, я - например, ума не приложу. Я наивно предполагал, что можно задать исключительную ситуацию, описать ее, и приложение будет само генерить исключение там, где такая ситуация возниакет, т.е. мне, как юзеру не придется делать проверку, что указатель нулевой и писать throw null_ptr, это за меня сделает компилятор. На самом же все придется проверять самому и генерить throw.
Но с другой стороны, в винде же это как-то реализовано... Т.е. определяет же система, что юзер долбится по нулевому адресу.
Может быть, конечно, это все можно реализовать на С++, но затраты будут несоизмеримы с премуществами.

То о чем ты здесь пишешь, не имеет отношения к исключениям с++ и больше напоминает систему ИИ. Причем необычайно мощную. Судя по описанию, компилятор сам должен определить в каких условиях требуется проверять соответствие текущего состояния программы твоим условиям, причем умудряться это делать без потери производительности. Сам понимаешь, задачка не из легких smile.gif
О том, что такое исключения, лучше всего почитать Страуструпа, в закреплении материала - статьи и их обсуждения. Хотя бы те две, ссылки на которые, я приводил выше.
А проверку на нулевой указатель можно произвести напрмер так:

Код

template <typename T>
struct iterator
{
 T& operator*()
 {
   if ( !m_value )
     throw null_ptr_exception();
   return *m_value;
 }

private:
 T* m_value;

}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)