Попрацювавши з винятками в Java та .NET AND, прочитавши багато статей про те, як / коли / чому ловити винятки, я нарешті придумав наступні кроки, які я проходжу в своїй голові, коли бачу потенційне виключення, або виняток, я повинен спіймати (Java) ... навіть якщо цього ніколи не відбувається (зітхання ...). І, здається, це працює, принаймні для мене:
- Чи можна щось корисне зробити з цим винятком (крім журналу)? Якщо відповідь "так", напишіть код обходу, і якщо вирішення може спричинити винятки, перейдіть до пункту 2:
- Оберніть виняток навколо виключення під час виконання, киньте його, перейдіть до 3.
- У класі вищого рівня, де була ініційована можлива транзакція з базою даних / процесом, виберіть виняток, відкату транзакції та повторне скидання винятку.
- Для класу верхнього рівня (який може бути тим, де була ініційована транзакція), введіть виняток, використовуючи структуру реєстрації, наприклад slf4j (поєднану, наприклад, з log4j ) або log4net . Якщо можливо, виключення надішліть електронною поштою до списку розповсюдження, який складається з розробників програми.
- Якщо є графічний інтерфейс, відобразіть повідомлення про помилку, яке найбільш зручно вказує, що спричинило проблему; не показуйте виняток / стек-трек, користувачеві це не важливо і не потрібно знати, що це NullPointerException.
Я також повинен додати крок 0 , де я навмисно кидаю те, що я називаю винятком "бізнес" (новий виняток, який я створюю, розширюючи клас "Виняток"), коли якесь складне лікування неможливо виконати через помилки даних, АЛЕ Як відомо, вони трапляються, оскільки вони були визначені як випадки виключення під час аналізу.
За винятком лісозаготівельної частини, я повністю згоден з пунктами, написаними "mikera"; Я просто додам, що виняток слід входити лише один раз .
Крім того, кроки, які я перерахував, можуть бути різними, якщо те, що ви пишете, є API / Framework . Там викидання продуманих винятків є обов'язковим, щоб допомогти розробникам зрозуміти свої помилки.
Щодо тестування винятків, використовуючи макетні об’єкти, ви повинні мати можливість протестувати майже все, будь то виняток, чи ні, за умови, що ваші класи дотримуються найкращої практики "одного класу, щоб зробити одне" Я також особисто переконуюсь, щоб позначити найважливіші, але приховані методи як "захищені", а не "приватні", щоб я міг перевірити їх без зайвих клопотів. Крім того, тестування винятків є простим, просто провокуйте виняток і "очікуйте", що виняток відбудеться шляхом його лову. Якщо ви не отримуєте винятку, у вас є помилка одиничного тесту.