Виняток - помилка блокування .
Перш за все, найкращою практикою повинно бути не кидати винятки за будь-яку помилку, якщо тільки це не блокуюча помилка .
Якщо помилка блокується , киньте виняток. Після того, як виняток уже кинуто, його не потрібно приховувати, оскільки він винятковий; повідомте користувача про це (ви повинні переформатувати весь виняток на щось корисне для користувача в інтерфейсі).
Ваша робота як розробник програмного забезпечення - домагатися запобігання виняткових випадків, коли деякі параметри або ситуація виконання може закінчитися винятком. Тобто винятки не слід вимкнути, але їх слід уникати .
Наприклад, якщо ви знаєте, що деякий цілочисельний вхід може мати недійсний формат, використовуйте int.TryParse
замість int.Parse
. Є маса випадків, коли ви можете це зробити замість того, щоб просто сказати "якщо це не вдасться, просто киньте виняток".
Кидати винятки дорого.
Якщо врешті-решт буде викинуто виняток, замість того, щоб виписати виняток у журнал, як тільки він був кинутий, однією з найкращих практик є ловлі його в обробці винятків з першого шансу . Наприклад:
- ASP.NET: Global.asax Application_Error
- Інші: AppDomain.FirstChanceException подія .
Моя позиція полягає в тому, що локальний спробу / улов краще підходить для обробки спеціальних випадків, коли ви можете перевести виняток в інший, або коли ви хочете "приглушити" його для дуже, дуже, дуже, дуже, дуже особливого випадку (помилка в бібліотеці викинути непов’язаний виняток, який потрібно відключити, щоб подолати всю помилку).
Для решти випадків:
- Намагайтеся уникати винятків.
- Якщо це неможливо: обробники виключень з першої ж можливості.
- Або використовуйте аспект PostSharp (AOP).
Відповідаючи на @thewhiteambit на коментар ...
@thewhiteambit сказав:
Винятки не є Fatal-помилками, вони є винятками! Іноді вони навіть не є Помилками, але вважати їх фатальними помилками - це абсолютно помилкове розуміння того, що таке Винятки.
Перш за все, як виняток не може бути навіть помилкою?
- Немає підключення до бази даних => Виняток.
- Недійсний формат рядка для розбору на виняток type =>
- Спроба розбору JSON і в той час як введення насправді не JSON => виняток
- Аргумент
null
під час очікування об'єкта => виняток
- Деяка бібліотека має помилку => кидає несподіваний виняток
- Існує розеткове з'єднання, і воно відключається. Потім ви намагаєтесь надіслати повідомлення => виняток
- ...
Ми можемо перерахувати 1k випадків, коли буде викинуто виняток, і зрештою, будь-який із можливих випадків буде помилкою .
Виняток - помилка, оскільки наприкінці дня це об’єкт, який збирає діагностичну інформацію - у ньому є повідомлення, і це відбувається, коли щось піде не так.
Ніхто не кидає виняток, коли немає виняткових випадків. Виняток має бути блокуванням помилок, тому що після їх викиду, якщо ви не намагаєтеся потрапити до використання try / catch та винятку для здійснення потоку управління, вони означають, що ваша програма / послуга припинять операцію, що вступила у винятковий випадок .
Також я пропоную всім перевірити невдалу парадигму, опубліковану Мартіном Фаулером (написану Джимом Шор) . Ось як я завжди розумів, як поводитися з винятками, ще до того, як я до цього документа потрапив.
[...] вважати їх Fatal-Errors є абсолютно помилковим розумінням того, що таке винятки.
Зазвичай винятки скорочують деякий потік операцій, і вони обробляються, щоб перетворити їх на зрозумілі людині помилки. Таким чином, здається, що виняток насправді є кращою парадигмою для обробки випадків помилок та роботи над ними, щоб уникнути повного збою програми / послуги та повідомити користувача / споживача, що щось пішло не так.
Більше відповідей про проблеми @thewhiteambit
Наприклад, у випадку відсутності підключення до бази даних програма може винятково продовжувати запис у локальний файл та надсилати зміни до бази даних, як тільки вона знову буде доступна. Ваш недійсний кастинг рядка до числа може бути спробуваний знову розібратися з локальною інтерпретацією мови на винятку, як, наприклад, при спробі англійської мови за замовчуванням Parse ("1,5") не вдалося, і ви спробуєте її знову з німецькою інтерпретацією, яка повністю добре, оскільки ми використовуємо кому замість точки як роздільник. Ви бачите, що ці Винятки не повинні навіть блокуватись, вони потребують лише певної обробки винятків.
Якщо ваш додаток може працювати в автономному режимі без збереження даних у базі даних, не слід використовувати винятки , оскільки реалізація потоку управління try/catch
розглядається як антидіаграма. Робота в режимі офлайн - це можливий випадок використання, тому ви впроваджуєте потік управління, щоб перевірити, чи доступна база даних чи ні, ви не чекаєте, поки вона недоступна .
The розбору - це також очікуваний випадок ( не ВИКЛАДНИЙ СЛУЧАЙ ). Якщо ви цього очікуєте, ви не використовуєте винятків для контролю потоку! . Ви отримуєте від користувача деякі метадані, щоб знати, яка його культура, і ви використовуєте для цього формати! .NET також підтримує це та інші середовища, і виняток, оскільки форматування чисел потрібно уникати, якщо ви очікуєте використання програми / послуги, пов’язаної з культурою .
Неопрацьоване виняток зазвичай стає помилкою, але самі винятки не є codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors
Ця стаття є лише думкою чи точкою зору автора.
Оскільки Вікіпедія може бути лише думкою авторів (артикулів), я б не сказав, що це догма , але перевірте, що в статті " Кодування за винятком" йде десь у якомусь абзаці:
[...] Використання цих винятків для обробки конкретних помилок, які виникають для продовження програми, називається кодуванням за винятком. Цей анти-шаблон може швидко погіршити програмне забезпечення в продуктивності та ремонтопридатності.
Тут також десь сказано:
Неправильне використання виключень
Часто кодування за винятком може призвести до подальших проблем із програмним забезпеченням при неправильному використанні виключень. На додаток до використання обробки винятків для унікальної проблеми, неправильне використання виключень сприймає це ще більше шляхом виконання коду, навіть після того, як виняток буде підвищений. Цей поганий метод програмування нагадує метод goto у багатьох мовах програмного забезпечення, але виникає лише після виявлення проблеми в програмному забезпеченні.
Чесно кажучи, я вважаю, що програмне забезпечення не може бути розроблене, не сприймаючи справи серйозно. Якщо ви знаєте, що ...
- Ваша база даних може перейти в офлайн ...
- Деякі файли можна заблокувати ...
- Можливо, деякі формати не підтримуються ...
- Деякі перевірки домену можуть не вдатися ...
- Ваш додаток має працювати в режимі офлайн ...
- незалежно від випадку використання ...
... ви не будете використовувати для цього винятки . Ви б підтримали ці випадки використання, використовуючи регулярний контрольний потік.
І якщо якийсь несподіваний випадок використання не буде охоплений, ваш код швидко вийде з ладу, оскільки це призведе до виключення . Правильно, тому що виняток - винятковий випадок .
З іншого боку, і, нарешті, іноді ви охоплюєте виняткові випадки, кидаючи очікувані винятки , але ви не кидаєте їх для здійснення потоку контролю. Ви робите це, тому що хочете повідомити верхні шари, що ви не підтримуєте певний регістр використання, або ваш код не працює з деякими заданими аргументами або даними / властивостями середовища.