Pull to refresh
-3
0

Программист

Send message
Мнение Реймонда Чена относится к голому механизму исключений Windows — а там даже не плюсы, а чистый Си и исключение — не объект, а структура.
1. Изменять до неузнаваемости незачем — есть хорошая техника цепных исключений.
2. Можно логировать выброшенное исключение сразу — до начала раскрутки стека.
Полагаю, что причина скорее в кривости именно плюсовых исключений.
Видел я такие проги — легче от этого не было никому. Куча защитного кода, увидеть за которым логику программы не может даже автор через пару месяцев.
Кстати, WinAPI тоже может бросать исключения.
А писать на голом Win32 — это для мазохистов
А еще лучше — вызывать FreeAndNil
За бизнес-логику на исключениях — жестоко караю на ревью.
Так теряются все плюсы исключений:
1. Код чистой бизнес-логики перестает хорошо читаться.
2. Производительность идет лесом.
3. Лог засоряется исключениями, которые не являются сбоями.
1. Вот такой синтаксис для Delphi означает присваивание полю или свойству объекта:
self.p := P.Create;

2. Вы говорите, простите, ересь. Того, кто освобождает ресурсы вне блоков finally или деструкторов (деструктор в Delphi — аналог finally для объектов) — больно и обидно бьют. За утечки при выбросе исключений.
Я читал про проблемы плюсовых исключений, но так как сам на них не пишу — не имею своего мнения :) В Delphi исключения вкусны и полезны при правильном их использовании — обозначении явных редких сбоев.
try..finally работает очень быстро, если не было выброшено исключение. На нем экономить бессмысленно.
Не встречал на Delphi непонятно падающего кода: даже в самых сложных случаях успешно отлавливал косяки в сторонних библиотеках, которые при использовании кодов ошибок хрен бы нашел.
С точностью до наоборот — подключая чужую библиотеку, я жду от нее, что она или вернет мне валидные данные или явно обозначит сбой выбросом исключения. Иначе я не смогу доверять библиотеке и буду вынужден писать тонны защитного кода с проверками, затрудняющими понимание моих собственных алгоритмов.
«Предположим, что вместо очереди у нас некоторый поток, который приходит из сети. При передаче могут возникать ошибки.» — это явно не ошибки в логике.
Последний абзац — серьезное заблуждение. Внешний мир для любой программной единицы несовершенен.
Функцию МОЖНО вызывать с невалидными значениями аргументов.
Файл МОЖЕТ оказать заблокирован другим процессом.
Сервер БД МОЖЕТ оказаться недоступным.
Это все — сбои вне вашего кода, сообщить о которых в большинстве языков можно двумя способами — кодом ошибок или исключениями. Второе много лучше по следующим причинам:
1. Исключение автоматически всплывает по стеку и больно бьет — код ошибок без сознательных усилий глотается
2. Исключения в ООП-языках можно наследовать — коды ошибок только добавлять новые.
3. «Бархатный путь» (основной алгоритм без сбоев) при использовании исключений читается гораздо лучше
Код в A.Foo — плохой. Очень.
1. Если один и тот же ресурс выделяется и освобождается в пределах одного метода, то его не следует делать полем объекта.
2. Освобождение поля объекта следует делать в деструкторе, а локальной переменной — в блоке finally.

try..except при нормальной работе нужен всего в трех случаях:
1. Предотвращение утечек в фабричных методах.
2. Повторный выброс исключения на границах абстракции (превращение «Не могу открыть файл» в «Не могу записать в лог»).
3. Собственно разбор полетов, там где нужно восстановление, повтор, логирование и т.п.

В остальных местах вполне хватает try..finally
В хорошем коде на Delphi — никогда. За плюсы, полагаю, тоже самое ответят плюсисты.
Особенно пикантно это смотрится на фоне экономии за счет устранения виртуальных вызовов.
Ага, на пользователей программы на C ну никак не повлияли.
Это не есть правильно, потому что в нормальных VCS версию имеет не файл, а репозитарий, что абсолютно логично для исходных тесктов программ, автоматически обеспечивая их согласованность между собой.
Т.е. вместо того, чтобы спокойно сделать update рабочей копии и получить новую версию или не делать update, взяв merge на себя, мне автоматически ломают рабочую копию, обновить которую до согласованного состояния я должен уже руками?
Спасибо за полный ответ. Нужной глубины интеграции со студией у сторонних бесплатных продуктов, естественно, нет и это реально киллер-фича.
Ставим бесплатный redmine — имеем все то же самое, кроме фазы с UML (интеграция с мерком там из коробки).
Итак — есть интеграция с UML. Что еще?

Information

Rating
Does not participate
Location
Россия
Registered
Activity