Какво трябва да направи една програма, когато срещне грешки? Според моя опит, много програми почти не обмислят това. Обикновено това е само минималното мълчаливо игнориране на грешки и може би записване, че са възникнали.

Това обаче е важно съображение при „обработка на грешки“. Една програма трябва да се държи правилно, когато възникнат грешки.

В тази статия ще разгледаме:

  • възможни реакции при грешки
  • примери за реакции при грешки в общи програми
  • как да се справяте с грешки във вашата програма
  • как да се справите с други грешки във вашата програма

Нека се потопим.

Опции за отговор

Има различни начини, по които можете да реагирате на грешки. Можеш:

  • срине програмата
  • тихо игнорирайте грешката
  • опитайте се да се възстановите по някакъв начин

Сривът на програмата е добра опция по подразбиране. Има множество ползи от него.

Едно предимство е, че програмата няма да прави грешни неща. Има много ситуации, при които софтуерът, който прави грешното нещо, е бил катастрофален.

Това не означава, че сривът е добър. Това означава, че вероятно е по-добре от мълчаливото игнориране на грешки. Например, добре е програма за калкулатор да се срине. Можете просто да го рестартирате и да продължите това, което правите. Но ако калкулаторът има грешки и дава грешен резултат, това може да бъде голям проблем.

Друго предимство на срива е, че прави грешките очевидни. Това означава, че можете незабавно да отстраните проблема.

В допълнение, сривът възможно най-скоро означава, че проследяването на стека ще бъде по-полезно. Той ще посочи кода на проблема. Вместо това, ако мълчаливо пренебрегнете грешката, програмата може да се срине по-късно (ако въобще). В този момент той няма да сочи към истинския източник на грешката. Това означава, че отстраняването на грешки ще бъде по-трудно.

Друга възможност е мълчаливо да игнорирате грешките. Понякога тази опция е добра. Зависи от потребителския опит. По-късно виждаме няколко примера, при които игнорирането на грешката е може би най-добрият вариант.

Последният вариант е да опитате да възстановите грешката по някакъв начин. Резултатът трябва да бъде така, сякаш грешката никога не се е случвала. Програмата трябва да може да продължи да се изпълнява правилно.

Примери за отговори на грешки

Ето някои примери за това как различните програми могат да реагират, когато срещнат грешки.

Програма, която е в ранна разработка

Ако една програма е в ранна разработка, вероятно е добре просто да се срине при грешки. Това ще улесни отстраняването на грешки.

Повечето настолни приложения

Повечето настолни приложения се сриват, когато нещо се обърка (ако не могат да се възстановят във фонов режим). Това обикновено е добре. За потребителя е много лесно да стартира програмата отново.

За програми, които са „програми за преглед“ (като Windows Photos), не се губят данни.

За програми, които променят данни (като Microsoft Word), има тенденция да се губи много малко. Тези програми обикновено имат функции за автоматично запазване, за да минимизират загубата на данни.

Грешка при „добавяне в количката“

Помислете, че имате уебсайт за електронна търговия. Възможно е да има грешка в бутона „добавяне в количката“, когато понякога продуктът не се добавя в количката.

Как трябва да се третира тази грешка?

Като за начало вероятно искате да уведомите потребителя. Би било много лошо, ако потребителят не разбере, че даден продукт липсва в количката му. Може да минат през касата и да поръчат всичко, да изчакат артикулът да пристигне и никога да не го получат. (Искам да кажа, направих това без никакви грешки за „добавяне в количката“ и мога да ви кажа, че е лошо…)

За да уведомите потребителя, можете да му покажете съобщение. Например, можете да им кажете:

  • действието се провали
  • че трябва да опитат отново по-късно
  • че трябва да опреснят страницата и да опитат отново

Проста анимация

Помислете, че имате прост уебсайт с малка анимация, която задействате с JavaScript.

За този уебсайт, ако анимацията не успее да се задейства, вероятно не е голяма работа.

В този случай по същество искате да игнорирате грешката тихо. Не уведомявайте потребителя, че е възникнал проблем. Анимацията не е достатъчно важна, за да уведоми и отвлече вниманието на потребителя от това, което прави.

Видео игра за един играч

Ако има грешка във видеоигра за един играч, това вероятно няма значение. В повечето случаи е много лошо за потребителското изживяване играта да се срине. Играта с бъги е за предпочитане пред срива. В този случай най-добрият вариант вероятно е мълчаливо да игнорирате грешката.

Важна система в самолета

За нещо критично за живота, бихте искали да се възстановите от грешки много внимателно и съзнателно.

Това може да означава излишък. Например, може да имате резервни системи, така че някой да може да поеме, ако нещо се обърка. Или може да имате програма за наблюдение на живо, която може да рестартира и инициализира отново други програми, които са довели до грешка или са се сринали. Или всякакви други неща. Можете също така да използвате защитно програмиране, за да предотвратите отказ на определени програми на първо място.

Как да се справяме с грешки

Грешка е, когато нещо неочаквано или очевидно нередно се случи във вашата програма. Възниква от грешно кодиране. Нямаше да е там, ако кодът беше правилен.

Когато обработвате грешки (или всяка грешка), трябва да имате предвид:

  • дали грешката е възстановима или не
  • потребителското изживяване
  • времето за разработка на различни отговори

Също така, независимо какво правите, трябва да записвате грешки, за да ги отстраните по-късно.

Възстановима ли е грешката (без срив)?

Някои грешки са невъзможни за възстановяване. Например, няма какво да направите, ако някой важен код винаги се проваля. Единственото решение е да коригирате кода.

Някои грешки обаче може да бъдат възстановени.

Един пример за евентуално възстановими грешки са периодичните грешки. Това са грешки, които възникват само при определени обстоятелства. Това включва условия на състезание или грешки, които се случват само при конкретно състояние.

С известно усилие може да успеете да се справите с тях, без да рестартирате основната програма. Например, ако дадена операция е неуспешна, можете да:

  • опитайте да стартирате операцията отново. Ако проблемът е състояние на състезание, може да работи следващия път.
  • опитайте да рестартирате дефектна подпрограма във фонов режим. След това опитайте отново операцията след това.
  • опитайте ръчно да коригирате състоянието на програмата до нещо, което работи
  • претоварете грешката на операцията към сървър

Друг пример може да е нещо като изчерпване на паметта. Дори това понякога може да бъде възстановимо.

Един проблем обаче е, че може да не знаете, че вашата програма има конкретен бъг. В края на краищата, ако знаете за грешката, тогава най-доброто решение би било да я поправите. Така че, ако не знаете за грешката, може да нямате обработка на грешки за нея.

Изключение е, ако правите „отбранително програмиране“. В този случай ще имате обработка на грешки „за всеки случай“. Всъщност няма да знаете дали имате грешка или не. Вместо това ще приложите обработка на грешки превантивно за всички видове възможни грешки.

И така, накратко:

  • някои грешки не могат да бъдат възстановени
  • някои грешки са възстановими, но няма да имате обработка на грешки за тях
  • някои грешки могат да бъдат възстановени и ще имате обработка на грешки за тях

Потребителското изживяване

Както е показано в примерите по-горе, различните програми трябва да реагират на грешки по различен начин. Понякога е добре програмата да се срине. Потребителят може да го рестартира или друг процес може да го рестартира автоматично. В други случаи можете мълчаливо да игнорирате грешката. В други случаи може да се наложи да направите всичко по силите си, за да се възстановите.

Усилие за внедряване на различни реакции при грешки

Като цяло, въпреки че някои грешки могат да бъдат възстановени, възстановяването може да бъде изключително трудно. Някои от проблемите с него са обяснени в защитното програмиране.

За сравнение, сривът на програмата е много лесен. Също така, това обикновено коригира грешки също толкова добре (ако не и по-добре), отколкото ръчното възстановяване.

Обобщение на обработката на грешки

Като цяло, когато срещнете грешки, основното правило е да сринете програмата. Най-важната причина за това е, че защитното програмиране може да бъде много трудно за прилагане.

В други случаи е добре да игнорирате грешките. Например, когато областта на кодовата база, която е допуснала грешка, е незначителна.

Възстановяването от грешки е рядкост. Запазено е само за защитно програмиране. Защитното програмиране се използва най-вече за софтуер, където времето за работа и коректността са изключително ценни.

И накрая, независимо какво правите, не забравяйте да записвате грешки, за да ги отстраните по-късно.

Как да се справим с други грешки

„Други грешки“ са неща, които не са грешки във вашата програма. Те могат да включват неща като:

  • неуспешно изпращане на мрежова заявка, защото мрежовата връзка прекъсна
  • неуспешно четене на файл от файловата система, защото файлът е изтрит от потребителя ръчно преди няколко милисекунди

Тези „грешки“ са нормални и очаквани. Това са неща, които всяка програма може да срещне. Няма нищо, което вашата програма може да направи, за да ги предотврати напълно.

Още веднъж, трябва да имате предвид:

  • дали грешката е поправима или не
  • потребителското изживяване
  • времето за разработка на различни отговори

Като цяло, много от тези грешки са както възстановими, така и лесни за възстановяване.

Например, помислете, че мрежова заявка не успя да изпрати, защото потребителят загуби интернет връзка. Сравнително лесно е да се покаже на потребителя съобщение. След това можете да ги помолите да опитат отново, след като се уверите, че са свързани с интернет. Това също води до добро потребителско изживяване. За сравнение, сривът на програмата би бил много лошо потребителско изживяване.

Като друг пример, можете да опитате да пишете във файл, който не съществува. В този случай подходящо и лесно решение може да бъде първо да създадете файла.

Така че като цяло общият съвет за тези грешки е да се справите и да се възстановите от тях. Разбира се, подробностите зависят от вашата програма. Някои от тези грешки може да са непоправими. В този случай сривът на програмата може да е по-добър вариант.

Последни бележки

Така че това е всичко за тази статия. Надявам се, че ви е било полезно.

Както винаги, ако някои точки са пропуснати или ако не сте съгласни с нещо, или имате някакви коментари или отзиви, моля, оставете коментар по-долу.

За следващите стъпки препоръчвам да разгледате другите статии в „серията за обработка на грешки“.

Добре, благодаря и до следващия път.

Кредити

Кредити за изображения:

  • Снимка на табели — Снимка от Alexander Schimmeck в Unsplash
  • Снимка на Дженга — Снимка от Michał Parzuchowski в Unsplash
  • Снимка на човек — Снимка от Sebastian Herrmann в Unsplash
  • Шах снимка — Снимка от Nothing Ahead от Pexels

Първоначално публикувано в https://programmingduck.com на 26 юли 2021 г.