Это связано с Q: Является ли использование оператора finally для выполнения работы после возврата плохим стилем / опасным?
В ссылочной версии Q код finally связан с используемой структурой и необходимостью предварительной выборки. Мой вопрос немного другой, и я считаю, что он уместен для широкой аудитории. Мой конкретный пример - приложение на C # winform, но это также относится и к окончательному использованию C ++ / Java.
Я заметил довольно много блоков try-catch-finally, где много кода, не связанного с исключениями и обработкой / очисткой исключений, скрытых внутри блока. И я признаю свою предвзятость к наличию очень узких блоков try-catch-finally с кодом, тесно связанным с исключением и обработкой. Вот несколько примеров того, что я вижу.
Блоки try будут иметь множество предварительных вызовов и устанавливаемых переменных, ведущих к коду, который может выдать. Информация журнала будет настроена и запущена в блоке try.
Наконец, блоки будут иметь вызовы форматирования формы / модуля / элемента управления (несмотря на то, что приложение собирается завершиться, как указано в блоке catch), а также создание новых объектов, таких как панели.
Грубо говоря:
methodName (...) { пытаться { // Много кода для метода ... // код, который может бросить ... // Много кода для метода и возврата ... } поймать (что-то) {// обработать исключение} наконец { // некоторая очистка из-за исключения, закрытие вещей // больше кода для материала, который был создан (игнорируя, что любые исключения могли выдать) ... // возможно создать еще несколько объектов } }
Код работает, поэтому в этом есть какая-то ценность. Это не очень хорошо инкапсулировано, и логика немного запутанная. Я (до боли) знаком с рисками, связанными с переносом кода, а также с рефакторингом, поэтому мой вопрос сводится к желанию узнать опыт других людей с аналогично структурированным кодом.
Плохой стиль оправдывает внесение изменений? Кто-нибудь сильно сгорел от подобной ситуации? Не могли бы вы поделиться подробностями этого неудачного опыта? Оставь это, потому что я чрезмерно реагирую, и это не так уж плохо в стиле? Получите пользу от обслуживания уборки?
finally
делает в C #). Что такое эквивалент C ++? Я думаю о коде после catch
, и то же самое относится и к коду после C # finally
.
Environment.FailFast()
; оно может быть не выполнено, если у вас есть неперехваченное исключение. И это становится еще сложнее, если у вас есть блок итератора, finally
который вы выполняете вручную.
finally
. Все хорошие применения подпадают под RAII / RRID / SBRM (какой бы аббревиатурой вы не хотели).