Це пов’язано із запитанням: Чи використання остаточного підрозділу для роботи після повернення поганого стилю / небезпечно?
У посиланні Q, нарешті, код пов'язаний із використовуваною структурою та необхідністю попереднього вибору. Моє запитання дещо інше, і я вважаю, що він є широким для широкої аудиторії. Мій конкретний приклад - додаток для формату C #, але це також стосується використання C ++ / Java.
Я помічаю досить багато блоків, які намагаються наздогнати, де існує багато коду, не пов'язаного із винятками та обробкою виключень / очищенням винятків, похованими всередині блоку. І я визнаю свою упередженість щодо того, щоб мати дуже жорсткі блоки пробного підключення з кодом, тісно пов'язаним з винятком та обробкою. Ось кілька прикладів того, що я бачу.
Спробуйте в блоках буде встановлено безліч попередніх викликів та змінних, що ведуть до коду, який може викинути. Інформація про журнал буде налаштована та запущена і в спробу блоку.
Нарешті блоки матимуть виклики форматування / модуля / керування форматуванням (незважаючи на те, що програма збирається припинити роботу, як це виражено в блоці вилову), а також створити нові об'єкти, такі як панелі.
Приблизно:
methodName (...) { спробуйте { // Багато коду для методу ... // код, який може кинути ... // Більше коду для методу та повернення ... } зловити (щось) {// обробляти виняток} нарешті { // деяка прибирання через виняток, закриття речей // більше коду для створених матеріалів (ігноруючи, що будь-які винятки могли кинути) ... // можливо створити ще якісь об’єкти } }
Код працює, тому в ньому є якесь значення. Він недостатньо інкапсульований, і логіка трохи заплутана. Мене (болісно) знайомі з ризиками перенесення коду, а також рефакторинг, тому моє запитання зводиться до того, щоб хотіти знати досвід інших з аналогічно структурованим кодом.
Чи виправданий поганий стиль внесення змін? Хтось сильно згорів від подібної ситуації? Чи хотіли б ви поділитися деталями цього поганого досвіду? Залиште це, тому що я надмірно реагую, і це не так погано в стилі? Отримайте переваги в обслуговуванні прибирання речей?
finally
робиться в C #). Що таке еквівалент С ++? Те, про що я думаю, - це код після catch
, і це застосовується для коду після C # finally
.
Environment.FailFast()
; він може не бути виконаний, якщо у вас є виняткове вилучення. І це стає ще складніше, якщо у вас є ітераторний блок, finally
який ви повторюєте вручну.
finally
. Усі корисні користі охоплені RAII / RRID / SBRM (залежно від того, що вам подобається).