Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Возвращение пустого объекта. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Приведение типов? http://www.cyberforum.ru/cpp-beginners/thread377884.html
Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает. .h class Km { private: static const double DIFFERENCE = 1.2; double kilometer; double...
C++ Цикл сложный 1. Элементы массива a(8) расположить в том массиве по убыванию. 2. Вычислить произведение матриц b(5*3) и c(3*6). Заранее вам большое спасибо! Программа С. http://www.cyberforum.ru/cpp-beginners/thread377881.html
C++ Семантический вопрос... как называется язык-то?
По моему правильно и разумно оформлять большие куски кода в классы в стиле с++, всё заинкапсулировать, следить за наследованием... Но чувствительные к скорости коды все пишут в стиле си, порой,...
C++ адаптеры
добрый вечер интересно ваше мнение. такие вещи как адаптеры, биндеры позиционируются как шибко быстро работающие. и рекомендуется ими активно пользоваться. Например вместо попыток определить...
C++ Разбить строку http://www.cyberforum.ru/cpp-beginners/thread377849.html
У меня есть строка string^ str в неё записано 6 символов. Как мне разбить эту строку на еще три строки в каждой из которых будут по два символа. тоесть примерно надо получить вот это: str...
C++ Объясните пожалуйста алгоритм Вычислите сумму с данной точностью е. Используйте указатели на функции как параметры: Сумма от 1 до бесконечности sin n/n Как я понял подставлять вместо n числа от 1 до беск и делить пока... подробнее

Показать сообщение отдельно
Bers
Заблокирован
05.11.2011, 18:37
Цитата Сообщение от ForEveR Посмотреть сообщение
STL кидает исключения при неправильном использовании класса.
Сравнение с STL не корректное. И вот почему:

Есть условно есть 3 типа ошибок:

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

- исключительные ситуации (приводят к аварийной ситуации по независящим от исполнителя причинам)
Пример: В момент записи физически закончилось место на диске.

- программные ошибки:
- программные ошибки управляющей логики клиентского кода.
- программные ошибки управляющей логики самого исполнителя.

Главное свойство программных ошибок: их быть не должно Их в принципе не должно быть.

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

Программные ошибки как правило вызывают аварийные ситуации, либо порчу данных (что ещё хуже, и именно по этой причине STL услужливо тыкает программистов носом в такие ошибки)

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

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

Но выход за пределы массива - красноречивая и однозначная ошибка самого этого программиста.
Ставить Ловушки на собственный быдлокод... это не очень продуктивная техника работы над ошибками. Гораздо эффективнее не допускать ошибок, а не приляпывать заплатки, пытаясь удержать на плаву систему, которая разваливается тупо по халатности программиста.
Тем не менее, программные ошибки случаются, и их тоже приходится учитывать.

В режиме отладки, Ловушка, отловившая "баг" в исполнителе, должна громко-громко начать ругаться матом, и требовать к пульту программиста, который накосячил.
По сути, такая ловушка - всего лишь подстраховка самого программиста от собственных глупостей. (Лично я в таких случаях вместо исключений, пользуюсь густо-густо намазанными ассертами)

В боевом же режиме, система должна проявлять чудеса живучести.
Ловушка должна пофиксить баг, отправить разработчикам репорт, но при этом сделать все, что бы "теоретически не рабочий модуль все равно хоть как то, но сработал". Например - откатить операцию назад, и попробовать перезапустить модуль (вдруг ошибка не всегда проявляется, и повторная попытка завершится удачей).

STL кидает исключения в двух типовых ситуациях:

- программные ошибки управляющей логики клиентского кода (STL уведомляет клиентов, что они написали косячный код. Она говорит клиентам: "вы накосячили, вы и разруливайте".
При этом, STL писалась для массового потребителя, и по дефолту полагает, что выход за пределы массива - программная ошибка (а вовсе не штатная, как может предположить конкретный программист-пользователь). Этот момент отражен в документации по STL, и мотивирован тем, что в 90% всех случаев выход за пределы массива - действительно программная ошибка, а не задумка автора кода.

Так же, STL услужливо сообщает клиенту, что он накосячил (а не пытается замалчивать проблему, проявляя чудеса живучести), что позволяет разработчикам ещё на этапе разработки и тестирования отлавливать все подобные ошибки.

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

-исключительная ситуация. Она говорит клиентам "произошёл сбой по независящим от меня причинам. Я ничего не могу с этим сделать".

Здесь, сам по себе контейнер насколько мог, настолько удерживал инвариант своего класса.
Скажем так, он сделал все, что мог сделать.

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

Как видите STL в этом смысле грамотная и адекватная.

И потом, поддержка инварианта класса задача не простая. И требует ресурсов. STL же ориентирована на производительность: уведомляет о проблемах (не пытаясь замалчивать, и проявлять чудеса живучести), а именно об исключительных ситуациях, и об ошибках самих программистов. Штатная работа контейнеров STL стабильна на все 100%
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru