LINUX.ORG.RU

[ещё c++] исключения


0

2

Смотрю на свой код и думаю: а не стоит ли добавить немного исключений?
Сейчас все работает по принципу: все, что указывается в кач-ве арг-ов, должно быть проверено выше. Пример: класс имеет методы, которые принимают ID, также у него есть метод isID, который проверяет наличие эл-та с указанным ID. В main() присутствует catch(...), который в случае неуспеха выводит сообщение о неизвестной ошибке.
Как вы считаете?
------------------------------------------------------------------------
Придумал. Наделаю простейших исключений, которые будут выводить сообщение о том, что случилось, если ошибка была таки просмотрена. Вроде, не так много их будет..



Последнее исправление: kermzyxer (всего исправлений: 1)

Мы считаем твой вопрос мутным и плохо сформулированным.

tailgunner ★★★★★
()

Смотрю на свой код и думаю: а не стоит ли добавить немного исключений?

Обычно думают о том, что бы еще убрать...

gensym ★★
()

что-то нифига не понял.

anonymous
()
Ответ на: комментарий от stack_protector

Пост мой читали? )
eafp:

This common Python coding style assumes the existence of valid keys
or attributes and catches exceptions if the assumption proves false.
This clean and fast style is characterized by the presence of many
try and except statements.

у меня:

все, что указывается в кач-ве арг-ов, должно быть проверено выше
В main() присутствует catch(...), который в случае неуспеха выводит сообщение о неизвестной ошибке.

У меня вот так работает:
http://docs.python.org/glossary.html#term-lbyl

Look before you leap. This coding style explicitly tests for
pre-conditions before making calls or lookups. This style contrasts
with the EAFP approach and is characterized by the presence of many
if statements.

kermzyxer
() автор топика

kermzyxer

Смотрю на свой код и думаю: а не стоит ли добавить немного исключений?

Не стоит добавлять что-либо по причине что «это есть в языке».

stolz
()

Больше исключений, хороших и разных!

yoghurt ★★★★★
()
Ответ на: комментарий от stolz

Я же не просто так, я о надежности пекусь. Еще раз все просмотрел, все же ваиант после "--------------- ..." неплох.

kermzyxer
() автор топика

а не стоит ли добавить

Сейчас все работает

эээ...

anonymous
()

[с++] .hpp
после этого можете делать все что угодно, там 100% говнокодер детектед

anonymous
()
Ответ на: комментарий от anonymous

да, в таких делах недооценивать нельзя

shty ★★★★★
()
Ответ на: комментарий от kermzyxer

Рекомендую почитать Стива Макконнелла. Хотя бы главу про обработку исключений (8.4). Я думаю, что после прочтения этой короткой главы все вопросы отпадут.

stolz
()

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

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Исключения - это модный и выразительный объектно-ориентированный способ передачи управления. Зачем же их избегать? Отказываться от такого мощного средства.

yoghurt ★★★★★
()

все, что указывается в кач-ве арг-ов, должно быть проверено

Проверки возможно ошибочного использования делаются внутри функций с помощью assert'ов. Смотри BOOST_ASSERT например. В debug сборке они выполняются, в release вырезаются компилятором. Исключения, они для исключительных ситуаций. Что считать исключительной ситуацией - тема отдельного холивора.

m0rph ★★★★★
()
Ответ на: комментарий от yoghurt

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

anonymous
()
Ответ на: комментарий от yoghurt

в системах с поддержкой рестартов, без раскрутки стека

можно об этой штуке поконкретнее? :3

anonymous
()

Ещё один укурок.

Исключения могут пригодиться, например, в конструкторе.

Если ты уже обрабатываешь ошибки, какой смысл переделывать обработку ошибок?

anonymous
()
Ответ на: комментарий от anonymous

смысл переделывать обработку ошибок?

Я об этом и не говорил.

kermzyxer
() автор топика
Ответ на: комментарий от anonymous

Исключения могут пригодиться, например, в конструкторе.

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

anonymous
()

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

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

deadman ★★
()
Ответ на: комментарий от anonymous

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

а конструктор будет состоять из вызова этого отдельного метода? И что он по-твоему должен делать, когда ничего не удалось? И как это должно быть обработано наверху?

deadman ★★
()
Ответ на: комментарий от deadman

а конструктор будет состоять из вызова этого отдельного метода?

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

И что он по-твоему должен делать, когда ничего не удалось?

«Он» - конструктор? Ничего, очевидно, раз он не вызывает этот метод.

И как это должно быть обработано наверху?

«Это» - фейл конструктора вызвать метод? Опять-таки никак, раз конструктор не вызывает метод.

anonymous
()
Ответ на: комментарий от deadman

А что предлагаешь делать, если файла нет на месте? Сообщить юзеру, и ждать, пока нажмёт на кнопочку «Повторить»? А если не гуёвое приложение.

aptyp ★★★★
()
Ответ на: комментарий от anonymous

потому что это медленно, йогурт

Анон, ты когда-нибудь упирался в скорость обработки исключений так, что оно становилось боттлнеком? Только честно.

и небезопасно

Вполне безопасно, если писать эксепшон-сейф код

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

Кто сказал ничего? Он не будет делать ничего опасного.
Если я создаю объект, то я хочу быть уверен, что я всегда его могу создать.
Покажи мне пример, когда конструктору ну обязательно нужно кидать исключения.

anonymous
()
Ответ на: комментарий от yoghurt

Исключения - это модный и выразительный объектно-ориентированный способ передачи управления. Зачем же их избегать?

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

KblCb ★★★★★
()

catch(...) - в любом случае зло, и его следует избегать.

В общем случае, добавление исключений в legacy code может оказаться весьма нетривиальной задачей. Читай Exceptional C++ и More exceptional C++ Саттера.

JackyTreehorn
()
Ответ на: комментарий от anonymous

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

JackyTreehorn
()
Ответ на: комментарий от yoghurt

Анон, ты когда-нибудь упирался в скорость обработки исключений так, что оно становилось боттлнеком? Только честно.

Я упирался. Механизм действительно довольно тормозной, хотя наш проект это не тривиальное открытие файла, а риалтайм симуляция. Проблема в том, что не все языки обязывают обрабатывать все исключения.

Booster ★★
()
Ответ на: комментарий от Booster

так неинтересно, от ифов взамен исключений вложеность блоков кода растет, а читабельность падает

anonymous
()
Ответ на: комментарий от anonymous

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

Booster ★★
()
Ответ на: комментарий от anonymous

так неинтересно, от ифов взамен исключений вложеность блоков кода растет, а читабельность падает

Когда в голове бардак, то вложенность может расти. Но это не значит, что вы идете правильным путем.

p.s. «Бардак в голове» - это не к вам лично.

andreyu ★★★★★
()
Ответ на: комментарий от Booster

Правильно сказать, что на прототип функции обращает внимание компилятор. Как там с совсем современными, сказать не могу.

JackyTreehorn
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.