Існує кілька правил поводження з винятками, які слід пам’ятати. Але спочатку потрібно пам’ятати, що винятки є частиною інтерфейсу, що піддається коду; документуйте їх . Це особливо важливо, коли інтерфейс, звичайно, є загальнодоступним, але це дуже гарна ідея і в приватних інтерфейсах.
Винятки слід обробляти лише в тому місці, коли код може зробити щось розумне з ними. Найгірший варіант обробки - взагалі нічого не робити з ними, що слід робити лише тоді, коли це абсолютно правильний варіант. (Коли в моєму коді є така ситуація, я включаю коментар до цього ефекту, щоб я не турбувався про порожнє тіло.)
Другий найгірший варіант - кинути незв'язаний виняток без оригіналу, що додається як причина. Проблема тут полягає в тому, що інформація в межах початкового винятку, яка б дозволила діагностувати проблему, втрачається; ви створюєте щось, з чим ніхто нічого не може зробити (крім скарг, що "це не працює", і всі ми знаємо, як ми ненавидимо ці повідомлення про помилки).
Набагато краще - це реєстрація винятку. Це дозволяє комусь з'ясувати, у чому полягає проблема, і виправити її, але ви повинні зареєструвати виняток лише в тому місці, коли воно в іншому випадку буде втрачено або повідомляється через зовнішнє з'єднання. Це не тому, що частіше журнал є основною проблемою як такою, а тому, що надмірне ведення журналу означає, що ви просто отримуєте журнал, який забирає більше місця, не містить більше інформації. Після того, як ви увійшли виняток, ви можете повідомити PRECIS до користувача / клієнта з чистою совістю ( до тих пір , як ви можете також включати в себе час генерації - або інший ідентифікатор кореляції - в цій доповіді , так що коротка версія може бути підібраний доповнити деталі, якщо це необхідно).
Найкращим варіантом є, звичайно, повністю поправити виняток, розібравшись із ситуацією помилок у повному обсязі. Якщо ви можете це зробити, будь-якими способами це зробіть! Це навіть може означати, що ви можете уникнути реєстрації винятку.
Один із способів поводження з винятком - це скинути ще один виняток, який забезпечує опис проблеми вищого рівня (наприклад, " failed to initialize
" замість " index out of bounds
"). Це гарна модель, доки ви не втратите інформацію про причину винятку; використовувати докладний виняток, щоб ініціалізувати виняток cause
вищого рівня або записати деталі (як обговорено вище). Ведення журналу є найбільш доцільним, коли ви збираєтеся перейти межу міжпроцесою, наприклад, виклик IPC, оскільки немає гарантії, що клас винятку низького рівня взагалі буде присутній на іншому кінці з'єднання. Тримання як прикріпленої причини є найбільш доцільним при перетині внутрішньої межі.
Ще один шаблон, який ви бачите, - це прихоплення та випуск:
try {
// ...
} catch (FooException e) {
throw e;
}
Це анти-шаблон, якщо ви не маєте обмежень типу з інших catch
пунктів, які означають, що ви не можете просто пропустити виняток самостійно. Тоді це просто потворна особливість Java.
Немає реальної різниці між перевіреними винятками та неперевіреними, крім того, що ви повинні оголосити перевірені винятки, які перетинають межі методу. Це все-таки хороша ідея документувати вивірені винятки (з @throws
коментарем javadoc), якщо ви знаєте, що їх навмисно кидають ваш код. Навмисно не кидайте java.lang.Error
та його підкласи (якщо ви не пишете реалізацію JVM).
Думка: випадок несподіваної помилки завжди представляє помилку у вашому коді. Перевірені винятки - це спосіб управління цією загрозою, і коли розробники навмисно використовують неперевірені винятки, як спосіб уникнути проблем з обробкою випадків помилок, ви створюєте багато технічної заборгованості, яку доведеться чистити деякий час якщо ви хочете надійний код. Неохайність поводження з помилками непрофесійна (перегляд помилок - це хороший спосіб визначити, наскільки хороший програміст насправді).