Використання NotImPLmentedException


15

Чи вважається поганою практикою кидати NotImplementedExceptionкод, про який ви ще не написали? Можливо, коментарі TODO вважатимуться безпечнішими?


6
Який був би мінус використання таких винятків для вас?
SRKX

@SRKX Існує ризик потрапляння у виробничий код винятків і приведення в дію всього блоку коду. (Ще не трапилося зі мною, але у нас всі вихідні дні) я особисто їх використовую, я переживав, що можу не помітити деякі недоліки.
Tom Squires

Як не дивно, жоден з тегів не визначає, якою мовою використовується. Це не стосується кожної загальної мови, оскільки у C немає ніяких винятків. Тут є місце для мовного тегу, хлопці.
Девід Торнлі

1
@DavidThornley, спочатку питання було позначено як C #, тому я перечитав тег.
svick

@svick: Думав, що це, ймовірно, C #. Дякуємо, що додали тег.
Девід Торнлі

Відповіді:


34

Я вважаю NotImplementedException, що насправді є хорошою практикою.

Дійсно, якщо ви забудете реалізувати метод, і ви його використаєте пізніше у своєму проекті (і повірте, це трапляється), ви можете витратити тривалий час налагодження, шукаючи те, що пішло не так крок за кроком. Якщо у вас є виняток, програма зупиниться безпосередньо, запросивши виняток (якщо ви вилучите виняток, ви знайдете його швидко, подивившись, який виняток ви зловили).

Я рекомендую використовувати NotImplementedException комбіновану з коментарями TODO, щоб ви поєднували допомогу з графічним інтерфейсом (із завданнями в VS) та безпеку програми.

Щодо версії випуску, на мою думку, це навіть важливіше, оскільки в більшості випадків ви віддаєте перевагу краху програми, а не тому, що програма, очевидно, працює належним чином, але дає помилкові результати.


6
Якщо ви використовуєте Resharper, він відображає NotImplementedExceptions так само, як і коментарі TODO. Я думаю, що це приємна особливість.
svick

1
Увійдіть у добру практику TDD, і ви отримаєте переможця
LRE

7

Це залежить від вашої загальної філософії щодо помилок та помилок. Я тип "жорсткої помилки": я викину виняток при найменшому натяку, що щось може бути не так; Я все запевняю; Якщо є помилка, якщо чогось очікувалося там, а його немає, або якщо щось є, і це не повинно, весь Всесвіт повинен зупинитися. Звук вигуку вікон повинен зловісно дзвонити через гучномовці.

Є й інші люди, які швидше не турбуватимуться про помилки. То що робити, якщо ми доставляємо його клієнтові, і весь модуль звітів відсутній, тому що ми забули його кодувати, і ніхто при тестуванні цього не зрозумів, тому що додаток про це занадто мовчав? Краще нічого не робити, ніж кидати виключення в обличчя клієнта!


Це як би ви хотіли різної поведінки в «Налагодження» та «Випуск», і твердження не завжди це скоротить. Я вважаю, що договори .Net Code можна вимкнути в Release.
Робота

1
Я здебільшого використовую твердження, які також вимкнено у звільненні. Я маю власну функцію твердження, яка потрапляє на місце налагодження у налагодженні, кидає виняток під час тестування або навіть не компілюється при випуску.
Майк Накіс

3

Я б сказав, що це гарна ідея. Зазвичай я бачу ті винятки, викинуті кодом скелета, який автоматично генерується з форми або діаграми чи чогось іншого. Виняток нагадує мені реалізувати код, і він гарантує, що будуть помилки, якщо я спробую використовувати функціонал, який був налаштований, але ніколи повністю не реалізований. Іноді я заглушу або заміню його чимось, що менше шансів зупинити виконання (наприклад, надрукувати попередження на консоль), але я вважаю, що це працює для мене.

Якщо ви будуєте бібліотеку, яку використовуватимуть інші, якщо цей виняток є кращим за альтернативу, який би користувач вашої бібліотеки викликав функцію і цікавився, чому нічого, здається, не відбувається. Звичайно, все ще досить погано мати цей виняток у відвантаженій бібліотеці, але краще, ніж мовчазні збої, ІМО.


1

Я думаю, що це добра практика. Альтернативою є поширення недійсного значення або стану, що вплине як на код тесту, так і на виробництво.


1
Тримайся .... ти маєш на увазі, де ти працюєш, код, який кидає NotImpl, зробив би це аж до QA? Навіть у виробництво?
Стівен Еверс

3
Ні, якраз навпаки: NotImpl - це приємний величезний червоний прапор / помилка. Але TODO не мають семантичної цінності і можуть перетворити їх на тест чи виробництво, тихо викручуючи речі. (Я міг би уявити собі політику виключення TODO з виробництва, але у нас немає такого правила.)
Ларрі OBrien

1

Я завжди використовую NotImplementedException- ось для чого це, зрештою.

Це пов'язано з поняттям "невдало швидко": якщо ваш код кидає виняток, його слід потрапити до початку виробництва. Якщо він дійсно потрапляє до виробництва, то принаймні клієнт знає, що збірка неправильна .

Якщо код повертає безглузде значення або, за voidметодами, не вживає жодних дій, то споживачі вашого коду можуть слушно вважати, що виклик був значущим, коли його не було. Потім, пізніше, коли вони отримають якийсь правильний код, їх код може зламатися, оскільки це залежить від попередньої неправильної поведінки.


0

Що це за проект? Робота чи дім? Вдома робіть все, що завгодно - все, що найкраще нагадує вам, що вам потрібно закінчити все, над чим ви працюєте.

На роботі закінчіть її писати.

Я не можу побачити ситуацію, коли я перевірив би код, який може / зламає інші розробники, QA або збірку.


Ну і те, і інше, я намагаюся дотримуватися передової практики і вдома.
Том Сквайрс

0

Я виконую як я, але \ todo в моєму автодоцінгу на doxygene, а потім кидаю виняток. Таким чином, якщо люди не зможуть заважати RTFM принаймні, вони зможуть розібратися, чому їхня програма вийшла з ладу, замість того, щоб запитати, чому існує оголошена функція, яка не повертає логічного значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.