Як призначити коди помилок?


13

Як, розробляючи проект середнього розміру, ви визначаєте, створюєте та підтримуєте коди помилок?

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

Якщо бути більш конкретним, я кажу про код помилки, такий як:

Error 401 Unauthorized.


1
коди помилок? Як "магічні числа"? Наприклад ... ПОМИЛКА 001. Потім ви переходите до списку і читаєте ERROR 001 означає, що bla bla bla ... Так?
wleao

@wleao - Yessir. Я відредагую своє питання, щоб охопити це. Дякую.
ахід


Під час редагування у вашому запитанні. Погляньте, як вони роблять це з http. Я не знаю, чи гарна ідея взагалі використовувати магічні числа. Однак якщо ви дійсно готові це зробити, дотримуйтесь їх концепцій. Наприклад, у них є систематика помилок (у вас це є?).
wleao

@wleao - ще немає, але завдяки вам та Петеру Тьореку я його точно буду створювати. :)
ahodder

Відповіді:


16

Немає.

Коди помилок - це анахронізм, вони випливають із старих часів, коли вихід був дійсно важким і дорогим, і єдиний спосіб сигналізувати про помилку, можливо, був через купу вогнів передньої панелі: передня панель pdp11 / 70

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

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


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

Використання ілюстрації чудово відповідає вашому аргументу. Я читав про PDP-11 вже назавжди. Але це насправді перше, що я бачив. Дякую.
Майк Оуенс

2
Всередині коду я краще обробляю код помилки, і я не такий вже й старий.
JeffO

@Jeff: Все, що ви можете зробити з кодами помилок, також можна зробити за винятком, а потім трохи більше. Якщо ви хочете імітувати коди помилок за винятком, все, що вам потрібно зробити, - це кинути замість повернення коду помилки, а пізніше замість порівняння значення повернення з E_OK (або будь-якою реакцією ОК). Якщо бути справедливим, C не має реальних винятків, а довгі стрибки не такі зручні, тому, якщо ви робите C, ви дещо вибачилися.
tdammers

@Mike: Зображення зі статті Вікіпедії із серії PDP-11; якщо це не просто знайти, я не знаю, що таке.
тдаммери

6

Ви повинні перевірити, як організовані коди помилок / статусу в загальних протоколах, таких як HTTP . Вони залишають чіткі діапазони для різних типів статусів / помилок. Це полегшує як користувачам ідентифікацію невідомого коду стану, так і розробникам присвоєння коду нового типу помилок, які раніше не оброблялися.


Додайте до своєї відповіді річ таксономії. Це полегшить управління та підтримку помилок.
wleao

3

Вибачте, навіщо взагалі використовувати коди помилок?
Ловіть виняток, запишіть його та запропонуйте надіслати звіт, якщо програма не може відновитись .

(Припустимо, що ваша мова підтримує винятки.)

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


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

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

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

1
Винятки дуже складні, щоб вийти правильно! Дивіться посилання у: programmers.stackexchange.com/questions/97874/…
Coder

@Coder: ваш приклад зловживає винятками. Ви повинні зловити те, що очікуєте, що вас кинуть . У більшості методів не потрібно очікувати, що буде відкинуто жодне виключення. Повна відповідальність програміста вирішувати, з чим боротися, і я погоджуюся, що це може бути важко виправити .
День

2

Я буду припускати процедурний контекст (С). Якщо у вас є об'єкти, об'єкт помилки, як правило, краще, виняток чи ні.

Ви повинні використовувати коди помилок, локальні для кожного модуля. Для бібліотеки у вас може бути спеціальний заголовок із переліком кодів помилок з номерами 1, 2 тощо (або -1, -2, якщо вам більше зручно). Обов’язково завжди повертайте один із цих кодів, наприклад перекладайте errnoу власні коди. Якщо у вас є кілька шарів модулів, перекладіть на кожному кроці (або заздалегідь визначте діапазон для більш глибокої помилки, наприклад, значення 1001 - 1050 від цього іншого модуля).

Також важливо надати засоби для перекладу коду в рядок. Ніколи не слід повідомляти лише про код, що призводить лише до розладу. Насправді майже будь-який код у вашій програмі повинен мати функцію перекладу рядків. Наприклад , як правило , має LIBC strerrorі strsignal, але , до жаль не вистачає strwaitstatus.


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