Чи стосується винятку наскрізний проблем?


13

Я не бачу великої різниці між питаннями обробки винятків та реєстрації даних, що обидва є суперечливими проблемами. Що ти думаєш? Чи не слід це обробляти окремо самостійно, а не переплітати з основною логікою, яку застосовує метод?

EDIT : Що я намагаюся сказати, це те, що, на мою думку, реалізація методу повинна містити лише логіку для успішного шляху виконання, а винятки мають бути оброблені в іншому місці. Йдеться не про перевірені / неперевірені винятки.

Наприклад, мова може обробляти винятки повністю перевіреним способом, використовуючи такі конструкції:

class FileReader {

  public String readFile(String path) {
    // implement the reading logic, avoid exception handling
  }

}

handler FileReader {

   handle String readFile(String path) {
      when (IOException joe) {
        // somehow access the FileInputStram and close it
      }
   }

}

У наведеній вище концептуальній мові програма не буде компілюватися за відсутності FileReader обробника , тому що readFile FileReader класу не викидає виняток. Таким чином, оголосивши FileReader обробник , компілятор може забезпечити його обробку і програма потім компілювати.

Таким чином, ми маємо найкраще з перевірених та неперевірених проблем виключень: надійність та читаність.

Відповіді:


14

У деяких випадках так

У тих випадках, коли у вас є виняток, який потрібно зареєструвати (який, як я вважаю, майже завжди), тоді так, виняток пов'язаний з наскрізною проблемою.

Більшість часу ні

Однак візьміть примірник SocketListener, якщо socketlistener кидає виняток через інший кінець, що перериває з'єднання, тоді це має бути очікуваною поведінкою, і тому програма повинна діяти відповідно до обставин, що спричинили виняток. Це не те, з чим повинен поводитися загальний аспект, і тому не повинен бути проблемою, що перетинається між собою.

Виявлення наскрізної проблеми

Якщо ви дублюєте один і той же код знову і знову, його потрібно абстрагувати. Якщо абстракція просуває себе до декількох шарів, це може бути проблемою, що перетинається. Тільки тоді його слід враховувати.


4

Ведення журналу необов’язково. Поводження з винятками не є.

Ведення журналу є досить загальним, і, хоча джерела з певної логіки, воно подається споживачеві. Винятки завжди характерні для логіки, і деякий код, який знає про цю логіку, повинен вирішувати безлад.

Принаймні, в моєму обмеженому використанні двох, це означає, що обидві цілі найкраще вирішувати різними способами, а не під однаковим дизайнерським парасолькою.


1

Я розглядаю поводження з винятками як наскрізну проблему для певних типів винятків. Існують місцеві винятки, з якими правильно керувати може лише код негайного виклику. Прикладом може бути виняток із бази даних при спробі виконання запиту. Але є також винятки, з якими можна і слід поширюватися більш глобально. Прикладом може бути виняток, пов’язаний із відсутністю даних про захист (змушуйте користувача знову входити в систему). Або принаймні вам потрібен глобальний обробник у випадку, якщо виняток проскочить більш конкретний код, щоб пояснити користувачеві, що вони повинні зробити, щоб перезапустити або надіслати журнал в ІТ чи щось подібне. Для цих типів глобальних винятків, які стосуються глобальних ситуацій, це проблема, що перетинається між собою.


0

Я думаю, що це пов'язане з проблемою непрохідних абстракцій.

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

Однак "принцип непрохідних абстракцій" є проблемою. Деякі винятки не можуть бути переведені у форму, яка має сенс у наступному шарі абстракції.

Виняток, пов'язаний з мережевою файловою системою, є простим прикладом. Помилка в мережі не може бути виражена термінами, які мають сенс "абстрагування" файлу, або, якщо це відбувається, ця абстракція насправді не повністю абстрагує всі деталі, пов'язані з реалізацією обробки файлів.

Відмова від мережі, таким чином, витікатиме з основної абстракції мережі, і тому повинна бути проблемою, що перетинається в решті коду.

Однак це не виключно для виключень. Всі ті коди помилок із поверненим значенням для файлових API, які насправді не пов’язані з абстракцією файлів, але замість цього детально про жорсткий диск або мережу або будь-які інші збої - це те саме в іншій формі, маючи на увазі, що збої на жорсткому диску та мережеві збої тощо - наскрізні проблеми, незалежно від того, як повідомляються про ці невдачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.