Читання статті Еріка Ліпперта про винятки, безумовно, було відкриття очей щодо того, як я повинен підходити до винятків як як виробника, так і як споживача. Однак я все ще намагаюся визначити керівництво щодо того, як уникнути неприємних винятків.
Конкретно:
- Припустимо , у вас є метод Save , який може потерпіти невдачу , тому що а) Хто - то змінив запис , перш ніж ви , або б) Значення , яке ви намагаєтеся створити , вже існує . Ці умови слід очікувати і не є винятковими, тому замість того, щоб викидати виняток, ви вирішили створити спробуйте версію свого методу TrySave, яка повертає булеву інформацію, вказуючи, чи збереження вдалося. Але якщо це не вдасться, як споживач дізнається, у чому була проблема? Або краще було б повернути перерахунок із зазначенням результату, на зразок Ok / RecordAlreadyModified / ValueAlreadyExists? З integer.TryParse цієї проблеми не існує, оскільки існує лише одна причина, коли метод може вийти з ладу.
- Чи справді попередній приклад неприємна ситуація? Або кидати виняток у цьому випадку буде кращим способом? Я знаю, що це робиться в більшості бібліотек та рамок, включаючи структуру Entity.
- Як ви вирішите, коли створити спробуйте версію свого методу, передбачивши якийсь спосіб попередньо перевірити, чи метод буде працювати чи ні? Зараз я дотримуюся цих рекомендацій:
- Якщо є шанс на стан гонки, то створіть Спробуйте версію. Це перешкоджає потребі споживача зловити екзогенний виняток. Наприклад, у описаному раніше способі збереження.
- Якщо метод тестування стану в значній мірі зробив би все, що робить оригінальний метод, тоді створіть Спробуйте версію. Наприклад, integer.TryParse ().
- У будь-якому іншому випадку створіть метод перевірки стану.