Чи є гарною практикою зловити перевірений виняток і кинути RuntimeException?


70

Я прочитав деякий код колеги і виявив, що він часто ловить різні винятки, а потім замість цього завжди кидає "RuntimeException". Я завжди вважав це дуже поганою практикою. Я помиляюся?


17
"Ціна перевірених винятків є порушенням відкритого / закритого принципу. Якщо ви кинете перевірений виняток із методу у своєму коді, а вилов є на три рівні вище, ви повинні оголосити цей виняток у підписі кожного методу між вами та уловом. Це означає, що зміна програмного забезпечення на низькому рівні може примусити зміни підпису на багатьох вищих рівнях ". —Роберт К. Мартін, «Чистий код», стор. 107
Сонго

6
Цікаво відзначити, що Джим Уолдо протиставляє неперевірені винятки в магазині "Java: хороші частини" shop.oreilly.com/product/9780596803742.do, кажучи, що дорослі програмісти повинні кидати лише перевірені винятки. Ми прочитали його в нашому JUG лише 6 років тому, коли він вийшов, і це здавалося гарною порадою! Тепер, за допомогою функціонального програмування, перевірені винятки є абсолютно непростими. Такі мови, як Скала та Котлін, навіть їх не мають. Я також почав обгортання перевірятись у неперевірених винятках.
GlenPeterson

@GlenPeterson Ви також маєте пораду в FP, щоб взагалі уникати викидів і використовувати натомість типи сум
jk.

Там також очевидний випадок функціональних інтерфейсів: зумовлені функціональні інтерфейси (тобто Function, Predicateі т.д.) не мають параметризрвані кидки положення. Це означає, що вам потрібно ловити, загортати та повторно скидати будь-які перевірені винятки у внутрішній цикл будь-якого методу stream (). Це саме по собі підказує баланс для мене, чи перевірені винятки є поганою ідеєю.
Джоель Корнетт

Немає нічого поганого в створенні спеціальних підкласів RuntimeException, щоб повідомляти про сенс через ваше виняток.
Джоел Корнетт

Відповіді:


55

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

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

Користуватися перевіреними винятками дуже просто, коли вони не призначені для використання (невідшкодовані умови чи навіть контрольний потік). Особливо, якщо перевірений виняток використовується для умов, з яких абонент не може відновитись, я вважаю, що виправдано перетворити цей виняток на виняток із виконання часу з корисним повідомленням / станом. На жаль, у багатьох випадках, коли хтось стикається з невиправданим станом, вони, як правило, мають порожній блок вилову, який є однією з найгірших речей, які ви можете зробити. Налагодження такої проблеми - одна з найбільших болів, з якою може стикатися розробник.

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


17
У більшості застосунків у реальному житті надзвичайно мало невиправних умов. Тут майже завжди є якийсь рівень, на якому можна і потрібно сказати "ОК, ця дія не вдалася, тому ми показуємо / записуємо гарне повідомлення про помилку і продовжуємо / чекаємо наступного".
Майкл Боргвардт

6
Це правда, @MichaelBorgwardt, але місце для такого виду обробки часто знаходиться на найвищому рівні програми, тому щоразу, коли я бачу, як розробники "обробляють" винятки на нижчих рівнях, зазвичай легко видалити їх обробку і просто переробляти виняток вгору Наприклад, веб-фреймворк, подібний JSF, фіксує винятки на найвищому рівні, друкує повідомлення журналу та продовжує обробляти інші запити (не кажучи про те, що обробка за замовчуванням підходить, лише приклад).
DavidS

40

Це може бути ДОБРО . Будь ласка, прочитайте:

http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

Здебільшого клієнтський код нічого не може зробити щодо SQLExceptions. Не соромтеся конвертувати їх у неперевірені винятки. Розглянемо наступний фрагмент коду:

public void dataAccessCode(){
  try{
      ..some code that throws SQLException
  }catch(SQLException ex){
      ex.printStacktrace();
  }
} 

Цей блок лову просто пригнічує виняток і нічого не робить. Виправданням є те, що мій клієнт нічого не міг би зробити з приводу SQLException. Як щодо цього поводитися таким чином?

public void dataAccessCode(){
   try{
       ..some code that throws SQLException
   }catch(SQLException ex){
       throw new RuntimeException(ex);
   }
} 

Це перетворює SQLException в RuntimeException. Якщо відбувається SQLException, застереження про викид кидає нове RuntimeException. Потік виконання призупиняється, і виняток надходить. Однак я не пошкоджую шар свого бізнес-об’єкта із непотрібною обробкою винятків, тим більше, що він не може нічого зробити щодо SQLException. Якщо мій вилов потребує кореневої причини виключення, я можу використовувати метод getCause (), доступний у всіх класах винятків, починаючи з JDK1.4.

Кидання перевірених винятків та неможливість відновлення після цього не допомагає.

Деякі люди навіть вважають, що перевірені винятки взагалі не повинні використовуватися. Дивіться http://www.ibm.com/developerworks/java/library/j-jtp05254/index.html

Нещодавно кілька добре оцінених експертів, серед яких Брюс Еккель і Род Джонсон, публічно заявили, що, спочатку вони повністю погоджувались з ортодоксальною позицією щодо перевірених винятків, вони прийшли до висновку, що ексклюзивне використання перевірених винятків не є такою доброю ідеєю, як це з'явилися спочатку, і перевірені винятки стали суттєвим джерелом проблем для багатьох великих проектів. Еккель займає більш екстремальну точку зору, припускаючи, що всі винятки слід не перевірити; Погляд Джонсона є більш консервативним, але все ж припускає, що ортодоксальна перевага перевіреним виняткам є надмірною. (Варто зазначити, що архітектори C #, які майже напевно мали багато досвіду використання Java-технології, вирішили опустити перевірені винятки з мовного дизайну, зробивши всі винятки неперевіреними винятками.

Також з того ж посилання:

Рішення про використання неперевірених винятків є складним, і зрозуміло, що очевидної відповіді немає. Рада НД - використовувати їх дарма, підхід C # (з яким погоджуються Еккель та інші) - використовувати їх для всього. Інші кажуть: "є середина".


13

Ні, ви не помиляєтесь. Його практика вкрай помилкова. Вам слід кинути виняток, який фіксує проблему, яка його викликала. RunTimeException - широкий і не досяжний. Це має бути NullPointerException, ArgumentException тощо. Що б точно не описувало, що пішло не так. Це надає можливість диференціювати проблеми, які слід вирішити, і дозволить програмі вижити проти помилок, які мають бути сценарієм "Не проходжу". Те, що він робить, є лише трохи кращим, ніж "On Error Resume Next", якщо щось не вистачає в інформації, наданій у питанні.


1
Дякую за підказку. А що, якщо він кине спеціальний виняток, який він реалізував, що успадковується безпосередньо від RuntimeException?
RoflcoptrException

27
@Gary Buyn: багато людей вважають, що перевірене виключення - це невдалий експеримент з мовної розробки, і саме вони повинні використовуватись економно, а не як звичку.
Майкл Боргвардт

7
@Gary Buyn: Ось стаття, яка досить добре висвітлює дискусію: ibm.com/developerworks/java/library/j-jtp05254/index.html Зауважте також, що за 15 років після введення Java цю функцію жодна інша мова не прийняла її, і C ++ знехтував подібну особливість.
Майкл Боргвардт

7
@c_maker: Насправді, Блох здебільшого просуває православний погляд, і ваш коментар, здається, в основному стосується використання більшої кількості винятків, періоду. На мою думку, єдиною вагомою причиною використання перевіреного винятку є умова, за якою ви очікуєте, що всі абоненти негайно впораються.
Майкл Боргвардт

14
Необхідне кидання перевірених винятків порушує інкапсуляцію. Що ви робите, якщо такий простий метод, як "getAccounts ()", видасть вам "SQLException", "NullPointerException" або "FileNotFoundException"? Ви можете впоратися? Ви, ймовірно, просто 'ловить (виняток е) {}'. Крім того, ці винятки - його реалізація специфічна! Це не повинно бути частиною договору! Все, що вам потрібно знати, - це помилка . А що робити, якщо впровадження зміниться? Раптом все має змінитися, тому що метод більше не кидає "SQLException", а замість "ParseXMLException"!
KL

8

Це залежить.

Ця практика може бути навіть мудрою . Існує багато ситуацій (наприклад, у веб-розробках), коли, якщо трапляється якийсь виняток, ви нічого не можете зробити (тому що ви не можете, наприклад, відремонтувати непослідовну БД з вашого коду :-), це може зробити лише розробник). У цих ситуаціях розумно зафіксувати викинутий виняток у виняток під час виконання, щоб його повторно скинути. Тоді ви можете зафіксувати всі ці винятки в якомусь шарі обробки винятків, увімкніть помилку та покажіть користувачеві приємний локалізований код помилки + повідомлення.

З іншого боку , якщо виняток не є часом виконання (перевіряється), розробник API вказує, що цей виняток є вирішеним і його слід відремонтувати. Якщо це можливо, то ви обов'язково повинні це зробити.

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


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

Метод, який видає виняток, як правило, не може знати, чи може абонент відновити його. З іншого боку, я б припустив, що метод повинен дозволяти звільненому виключенню, викинутому внутрішнім методом, лише тоді, коли відомо, чому внутрішній метод кинув виняток, і причина узгоджується з API зовнішнього методу. Якщо внутрішній метод несподівано кидає перевірений виняток, пускання його в міхур як перевірений виняток може залишити абонента неправильно поінформованим щодо того, що сталося.
supercat

2
Дякуємо, що згадали про exception handling layer- наприклад, у веб-програмі, фільтрі.
Джейк Торонто

5

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

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

Якщо припустити, що RuntimeException пізніше не потрапляє та ігнорується, це не місце, де поруч OnErrorResumeNext.

OnErrorResumeNext виникне, коли хтось виловить виняток і просто ігнорує його або просто роздруковує його. Це жахливо погана практика майже у всіх випадках.


Це може бути справа у верхній частині дерева дзвінків, де єдине, що ви можете зробити, це спробувати виправитись витончено, а знання конкретної помилки насправді не допоможе. У такому випадку вам, можливо, доведеться записати помилку та рухатися далі (обробити наступний запис, повідомити користувача, що сталася помилка тощо). Інакше ні. Ви завжди повинні обробляти винятки як можна ближче до помилки, наскільки це практично, а не загортати їх як білий слон для наступного обробника.
Майкл К

@MichaelK Проблема "настільки ж близька до помилки, наскільки це практично", на практиці часто означає "через декілька втручаються шарів, які перебувають поза вашим безпосереднім контролем". Наприклад, якщо мій клас повинен реалізувати певний інтерфейс, у мене руки пов'язані. Це може статися довільно глибоко в дереві дзвінків. Навіть коли інтерфейси знаходяться під моїм контролем, додавання оголошень кидків може зробити абстракцію пропускною, якщо є лише обмежений набір конкретних реалізацій, які можна мислити. Змусити кожного клієнта сплатити витрати за деталі реалізації декількох не є великим дизайнерським компромісом IMO.
Тім Сегейн

4

TL; DR

Приміщення

  • Винятки з виконання повинні бути викинуті, коли помилка не виправляється: коли помилка знаходиться в коді, і не залежить від зовнішнього стану (таким чином, відновлення буде виправляти код).
  • Перевірені винятки слід скидати, коли код правильний, але зовнішній стан не такий, як очікувалося: відсутність підключення до мережі, файл не знайдений або пошкоджений тощо.

Висновок

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


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

Коли доцільно кинути виняток із виконання? Ви викидаєте виняток із виконання, коли зрозуміло, що код неправильний, і що відновлення доцільно, змінивши код.

Наприклад, доцільно кинути виняток з виконання для наступного:

float nan = 1/0;

Це викине поділ за нульовим винятком виконання. Це доречно, оскільки код несправний.

Або, наприклад, ось частина конструктора HashMap's:

public HashMap(int initialCapacity, float loadFactor) {
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity);
    if (initialCapacity > MAXIMUM_CAPACITY)
        initialCapacity = MAXIMUM_CAPACITY;
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new IllegalArgumentException("Illegal load factor: " +
                loadFactor);
    // more irrelevant code...
}

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

Коли доцільно кинути перевірений виняток? Ви кидаєте перевіряється виключення , коли питання є очікуваного відшкодування без зміни коду. Або, якщо говорити це по-різному, ви кидаєте перевірений виняток, коли помилка пов'язана зі станом, а код правильний.

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

Візьмемо приклад, який згадувався у відповіді mrmuggles:

public void dataAccessCode(){
   try{
       ..some code that throws SQLException
   }catch(SQLException ex){
       throw new RuntimeException(ex);
   }
}

Це не правильний спосіб поводження з перевіреним винятком. Сама нездатність обробляти виняток із сфери застосування цього методу не означає, що додаток має бути збій. Замість цього доцільно поширити його на більш високу сферу, наприклад:

public Data dataAccessCode() throws SQLException {
    // some code that communicates with the database
}

Що дозволяє можливість відновлення абонентом:

public void loadDataAndShowUi() {
    try {
        Data data = dataAccessCode();
        showUiForData(data);
    } catch(SQLException e) {
        // Recover by showing an error alert dialog
        showCantLoadDataErrorDialog();
    }
}

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

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

Тепер, коли ми зрозуміли це розрізнення, ми можемо перейти до виведення, коли нормально повторно скинути перевірений виняток як виняток із виконання.


З огляду на вищесказане, коли доцільно повторно скинути перевірений виняток як RuntimeException? Коли використовуваний вами код передбачає залежність від зовнішнього стану, але ви можете чітко стверджувати, що він не залежить від зовнішнього стану.

Розглянемо наступне:

StringReader sr = new StringReader("{\"test\":\"test\"}");
try {
    doesSomethingWithReader(sr); // calls #read, so propagates IOException
} catch (IOException e) {
    throw new IllegalStateException(e);
}

У цьому прикладі код поширюється, IOExceptionоскільки API Readerрозроблений для доступу до зовнішнього стану, проте ми знаємо, що StringReaderреалізація не має доступу до зовнішнього стану. У цій галузі, де ми можемо, безумовно, стверджувати, що частини, що беруть участь у виклику, не мають доступу до IO або будь-якого іншого зовнішнього стану, ми можемо сміливо переосмислити виняток як виняток під час виконання, не дивуючи колег, які не знають про нашу реалізацію (і можливо припускаючи, що код, що має доступ до IO, буде кидати an IOException).


Причиною суворого контролю винятків , що залежать від зовнішнього стану, є те, що вони є недетермінованими (на відміну від винятків, залежних від логіки, які передбачувано відтворюватимуться кожного разу для версії коду). Наприклад, якщо ви спробуєте поділити на 0, ви завжди створюватимете виняток. Якщо ви не розділите на 0, ви ніколи не створите винятку, і вам не доведеться обробляти цей виняток, тому що він ніколи не відбудеться. У випадку доступу до файлу, однак один раз успіх не означає, що наступного разу ви досягнете успіху - користувач, можливо, змінив дозволи, інший процес може видалити або змінити його. Тому вам завжди доводиться працювати з цим винятковим випадком, або у вас, ймовірно, є помилка.


2

Для автономних програм. Коли ви знаєте, що ваша програма не може обробити виняток, ви можете замість того, щоб кидати перевірену RuntimeException, помилку, кинути помилку, дозволити збій програми, сподіватися на повідомлення про помилки та виправити свою програму. (Див відповідь на mrmuggles для більш глибокого обговорення про і проти здається проти безконтрольно.)


2

Це звичайна практика у багатьох рамках. Наприклад, Hibernateробить саме це. Ідея полягає в тому, що API не повинні бути нав'язливими для клієнтської сторони та Exceptionнав'язливими, оскільки ви повинні явно написати код, щоб обробити їх у тому місці, де ви викликаєте api. Але це місце може бути не правильним місцем для обробки винятку, в першу чергу.
Насправді, чесно кажучи, це "гаряча" тема, і багато спір, тому я не став би сторону, але скажу, що те, що робить / пропонує ваш друг, не є звичайним і не рідким.


1

Вся справа "перевіреного винятку" - погана ідея.

Структуроване програмування дозволяє передавати інформацію лише між функціями (або, кажучи на мові, методами) лише тоді, коли вони знаходяться "поруч". Точніше, інформація може переміщуватися через функції лише двома способами:

  1. Від абонента до виклику через передачу аргументу.

  2. Від виклику до його абонента як зворотні значення.

Це принципово добре. Це те, що дозволяє міркувати про свій код на місцевому рівні: якщо вам потрібно зрозуміти або змінити частину програми, вам потрібно лише переглянути цю частину та інші «сусідні».

Однак, за деяких обставин, потрібно надсилати інформацію у "віддалену" функцію, без того, щоб хтось із середини "знав". Це саме тоді, коли потрібно використовувати винятки. Виняток - секретне повідомлення, яке надсилається від рейзера (незалежно від того, яка частина вашого коду може містити throwзаяву) на оброблювач (незалежно від того, яка частина вашого коду може містити catchблок, сумісний із винятком, який був thrown).

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


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

0

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

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

Наприклад, Integer.parseInt (String) бере рядок і повертає цілочисельний еквівалент його та викидає NumberFormatException у випадку, якщо рядок не є числовим. Тепер уявіть, що подання форми з полем ageперетворюється за допомогою цього методу, але клієнт уже забезпечив би перевірку з його боку, тому немає сенсу примушувати перевірку винятку.


0

Тут справді є пара питань

  1. Чи слід перетворювати перевірені винятки в неперевірені?

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

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

  1. Якщо ви збираєтесь перетворити неперевірений виняток у перевірений виняток, як слід це зробити.

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

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


0

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

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

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

Скажімо, ваш додаток має такі шари знизу вгору NET, TCP, HTTP, REST, DATA MODEL, BUSINESS.

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

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

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

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


-2

На мою думку,

На рівні фреймворку нам слід виключати винятки з виконання лову, щоб зменшити більше блоків спроб вилову для того, хто вийшов.

На рівні програми ми рідко фіксуємо винятки з виконання часу, і я думаю, що ця практика була поганою.


1
І що ви зробите з тими винятками на рівні рамки?
Матьє

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