Як я можу покращити перевірку помилок та обробку помилок?


13

Останнім часом я намагаюся зрозуміти, що таке правильна кількість перевірок та які належні методи.

У мене є кілька питань щодо цього:

Який правильний спосіб перевірити наявність помилок (поганий ввід, поганий стан тощо)? Чи краще чітко перевірити наявність помилок або використовувати такі функції, як твердження, які можна оптимізувати з вашого остаточного коду? Я відчуваю, що явно перевіряю захаращення програми з великою кількістю зайвого коду, який у будь-якому випадку не слід виконувати - і не кажучи вже про більшість помилок, які закінчуються помилкою аборту / виходу. Чому захаращувати функцію явними чеками просто для відмови? Я шукав твердження проти явної перевірки помилок і знайшов мало, щоб справді пояснити, коли робити будь-яку.

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

Malloc returning null, check explictly
API user inserting odd input for functions, use asserts

Чи може це зробити мене краще при перевірці помилок? Що ще можу зробити? Я дуже хочу вдосконалити та написати краще, «професійний» код.


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

Дякую, я не був впевнений. Я думав, оскільки це було дуже пов'язано з кодом, так би було добре.
Anon,

3
Проста відповідь - "Тому були винайдені винятки. Отримайте кращу мову".
DeadMG

1
@DeadMG: setjmp/ longjmpдоступні на мові C, тому вам не потрібна нова мова.
користувач786653

3
@DeadMG: Хтось, хто не може отримати правильну перевірку помилок C, має шанси на сніжки в пеклі отримати право C ++ винятком керування правом ...
Coder

Відповіді:


4

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


2

Перевірте будь-що в будь-який час (це могло змінитися після останньої перевірки), що не на 100% під вашою командою. А також: Під час розробки навіть не довіряйте собі! ;-)

Okokok ... "що завгодно" мається на увазі як перевірка таких речей, які могли б спричинити ненормальний переривання або що-небудь, що може змусити вашу програму / систему робити те, чого вона не повинна робити.

Якщо говорити серйозно, остання частина останнього речення є важливою, оскільки вона вказує на головне питання:

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


1
+1 для "перевірити все". Я не купую аргумент захаращеності коду: будь-який програміст у будь-якому разі повинен вміти розрізняти перевірку помилок та фактичну логіку.
стинь

2

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

По-перше - я б сказав, що немає жодної причини, через яку не слід обробляти жодну помилку, повернуту підлеглим методом. А помилок і винятків - це просто більше, ніж повернені значення або всі спроби / зловлення.

  1. Просто кидати і ловити недостатньо.
    Дивіться це : там, де автор пояснює, що лише ловивши, але нічого не роблячи, потенційно пригнічує виняток, і якщо тільки не зроблено достатньо, щоб скасувати шкоду - це гірше, ніж відпустити код просто так. Так само написання заяви "журналу", коли є відкритий файл чи помилка читання, може допомогти знайти причину, але - до моменту завершення програми це може призвести до пошкодження даних! Мало сказати, що у мене багато спроб / лову - важливіше знати, що вони насправді роблять!

  2. Не зловживайте спробою і ловом.
    Інколи - переважно ліниві або наївні програмісти думають, що після написання достатньої кількості спроб / лову, їхня робота закінчена і легка. Досить часто найкраще застосовувати коригувальні дії та відновити, а не просто скидати всю справу. Якщо цього неможливо зробити, потрібно вирішити, на якому рівні вам потрібно повернутися. Залежно від контексту та суворості, спроба вловити гніздування потребує ретельного проектування. Наприклад- Дивіться це і це

  3. Визначте, хто відповідає:
    Одне з перших, що вам слід зробити, - це визначити, чи є вхід, що вводиться в порядок, лише неприйнятний (або поки що не обробляється) сценарій, або є винятком через оточення (наприклад, системна проблема, проблема з пам'яттю), або чи ця ситуація є повністю внутрішньою, що випливає з результатів алгоритму. У всіх випадках - рівень, на якому ви, можливо, захочете повернутися до дії чи ви хочете здійснити, значно відрізняється. У цьому світлі я хотів би сказати - що коли ви запускаєте код у виробництві, змусити abort () вийти з програми добре - але не для кожної дрібниці. Якщо ви виявите пошкодження пам’яті або поза пам’яттю, то безсумнівно, що навіть зробивши все можливе - все помре. Але якщо ви отримаєте вказівник NULL на вході - я б не

  4. Визначте, що є найкращим можливим результатом:
    Те, що всі речі потрібно робити за винятком, дуже критично. Наприклад, якщо в одному з наших випадків - медіаплеєр виявить, що він не має повних даних, які слід відтворювати користувачеві - що це робити?

    • або пропустити якусь погану частину і побачити, чи може вона випереджати хороші речі.
    • якщо це трапляється занадто багато, подумайте, чи можна перейти до наступної пісні.
    • якщо він виявить, що не в змозі прочитати жоден файл - зупиніться і покажіть щось.
    • в цей час
    • під яким станом повинен гравець POP-UP для користувача та
    • коли він повинен вести його самостійно?
    • Якщо «зупиняти» речі, потрібно запитати відгук користувачів
    • чи це повинно ставити ненав’язливу маленьку примітку про помилку в якомусь кутку?

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

  5. Іноді нам потрібно перевірити винятки, перш ніж вони виникнуть. Найпоширеніший приклад - поділка на нульову помилку. В ідеалі потрібно перевірити, що перед цим винятком - і якщо це так - спробуйте поставити найбільш відповідне ненульове значення і рухатися далі, а не піти на самогубство!

  6. Прибирати. Принаймні, це потрібно зробити! Якщо функція відбувається, щоб відкрити 3 файли, а четвертий не вдалося відкрити - зайве сказати, що перші 3 мали бути закриті. Делегування цієї роботи на шар вище - погана ідея. якщо ви вирішите зовсім не залишити без очищення пам'яті. І найголовніше - навіть якщо ви пережили виняток, повідомте вище, що все не пішло нормальним шляхом.

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

Краща довідка: Розділ 6 Craft Code - доступний для завантаження


1

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

Використовуйте перевірку помилок і у випуску, ви можете вдатися до чогось такого простого, як:

if(somethinghitthefan)
     abort();

Це також має дуже хороший побічний ефект, що ви точно не будете ігнорувати помилку, як тільки програма почне збиватися на комп'ютері бета-тестерів.

Глядачі та журнали подій абсолютно марні порівняно з тим abort(), хто їх перевіряє?


exit / abort == найгірший досвід користувача коли-небудь: додаток просто зникає, не повідомляючи, чому ..
stijn

@stijn: abortрозбивається на відладчик / створює дамп. exitце погано, так. Хоча, я віддаю перевагу __asm int 3найбільше.
Кодер

це правда, і в C / C ++ я схильний писати твердження, використовуючи також __asm ​​int 3, але ніколи не показуючи принаймні опис того, чому, а також бажано також лінії та файли. Тоді принаймні замовник може дати інформацію про те, що саме сталося.
stijn

0

Різні речі, які ви можете зробити, - це
1.Прочитайте та засвоюйте багато коду в Інтернеті і подивіться, як це робиться.
2. Використовуйте деякі інструменти налагодження, щоб допомогти вам знайти регіони помилок.
3. Будьте в курсі дрібницьких помилок через неправильне призначення та синтаксичні помилки.
4. Деякі гірші помилки виникають через логічні помилки в програмі, які важче знайти. Для цього ви можете це виявити і знайти, або для більш складних спробуйте поговорити з людьми або використовувати ресурси, такі як Stackoverflow , Wikipedia , google, щоб отримати допомогу від Люди.

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