Використовуйте винятки для виняткових речей - речей, з якими розумно не можна очікувати, що трапляються занадто часто - речі, які свідчать про те, що щось піде не так. Наприклад, якщо мережа відключена, це надзвичайна річ для веб-сервера. Якщо база даних недоступна, це означає, що щось не так. Якщо файл конфігурації відсутній, це, ймовірно, означає, що користувач переплутав його.
Не використовуйте винятки для обробки неправильного коду. Щоб перевірити правильність коду, слід використовувати або твердження, або, у .NET Framework 4 і пізніших, контракти з кодом (які замінюють твердження і мають додаткові, особливо цінні функції).
Не використовуйте винятки у виняткових випадках. Те, що користувач, коли його попросили ввести номер, ввів "собаку", не такий винятковий, щоб заслужити виняток.
Будьте уважні, обираючи типи винятків. Створіть власні типи за потреби. Ретельно вибирали спадщину, маючи на увазі, що спіймані батьки захоплять і дітей. Ніколи throw Exception
.
Не використовуйте коди повернення для помилок. Коди помилок легко маскуються, ігноруються, забуваються. Якщо є помилка, або виправте її, або розповсюдьте її у верхній стек.
У випадках, коли очікується, що метод поверне помилку і помилка не є винятковою, використовуйте переписки, ніколи не номери помилок. Приклад:
// Note that the operation fails pretty often, since it deals with the servers which are
// frequently unavailable, and the ones which send garbage instead of the actual data.
private LoadOperationResult LoadProductsFromWeb()
{
...
}
Значення LoadOperationResult.ServerUnavailable
, LoadOperationResult.ParsingError
і т. Д. Набагато чіткіше, ніж, скажімо, пам’ятати, що код 12 означає, що сервер не працює, а код 13 - що дані неможливо проаналізувати.
Використовуйте коди помилок, коли вони посилаються на загальні, відомі кожному розробнику, який працює в певній галузі. Наприклад, не винаходити значення перерахунку для HTTP 404 Not Found або HTTP 500 Internal Server Error.
Остерігайтеся буленів. Рано чи пізно вам захочеться дізнатися не лише про те, чи вдався чи не вдався конкретний метод, але й чому. Винятки та перерахунки набагато сильніші для цього.
Не вловлюйте кожного винятку (якщо ви не знаходитесь у самій вершині стека). Якщо ви спіймаєте виняток, ви повинні бути готові впоратися з цим. Якщо все зробити, це означає, що вам все одно, чи правильно працює ваш код. Це може вирішити "Я не хочу шукати зараз, як це виправити", але рано чи пізно зашкодить вам.
У C # ніколи не перезавантажуйте такі винятки:
catch (SomeException ex)
{
...
throw ex;
}
бо ти ламаєш стек. Зробіть це замість цього:
catch (SomeException)
{
...
throw;
}
Докладайте зусиль, коли пишете повідомлення про виключення. Скільки разів я бачив щось подібне throw Exception("wrong data")
або throw Exception("shouldn't call this method in this context")
. Інші розробники, включаючи себе через півроку, не мали б уявлення про те, що дані не так і чому ми не повинні називати якийсь метод у контексті, а також який саме.
Не показуйте користувачеві повідомлення про виключення. Вони не очікуються від звичайних людей, а часто навіть не читаються для самих розробників.
Не локалізуйте повідомлення про виключення. Пошук документації для локалізованого повідомлення є виснажливим та безглуздим: кожне повідомлення має бути лише англійською та англійською мовами.
Не зосереджуйтесь виключно на винятках та помилках: журнали також надзвичайно важливі.
У .NET, не забудьте включити винятки в документацію XML методу:
/// <exception cref="MyException">Description of the exception</exception>
Включення винятків у XML-документацію значно полегшує людину, яка користується бібліотекою. Немає нічого більш прикрого, ніж намагатися відгадати, який виняток може бути кинутий методом і чому.
У цьому сенсі¹, обробка виключень Java забезпечує суворіший та кращий підхід. Це змушує вас або мати справу з винятками, які потенційно можуть викликати названі методи, або заявити у своєму власному методі, що він може кидати винятки, з якими ви не працюєте, роблячи речі особливо прозорими.