Код ошибки (англ. ) в программировании, — это номер (или сочетания буквы и номера), который соответствует конкретной проблеме в работе программы. Коды ошибок используются для идентификации неправильной работы аппаратного и программного обеспечения, неверного ввода данных пользователем без обработки возникающей при этом исключительной ситуации в коде программы, хотя иногда коды ошибок используются в сочетании с обработкой исключений. Коды ошибок не следует путать с кодами возврата, хотя они часто используются вместе при обработке ошибок. Одни из самых серьёзных кодов ошибок, которые могут встретить пользователи — это коды «Синего экрана смерти» операционной системы Microsoft Windows.
Время на прочтение
Почти все разработчики так или иначе постоянно работают с api по http, клиентские разработчики работают с api backend своего сайта или приложения, а бэкендеры “дергают” бэкенды других сервисов, как внутренних, так и внешних. И мне кажется, одна из самых главных вещей в хорошем API это формат передачи ошибок. Ведь если это сделано плохо/неудобно, то разработчик, использующий это API, скорее всего не обработает ошибки, а клиенты будут пользоваться молчаливо ломающимся продуктом.
За 7 лет я как поддерживал множество legacy API, так и разрабатывал c нуля. И я поработал, наверное, с большинством стратегий по возвращению ошибок, но каждая из них создавала дискомфорт в той или иной мере. В последнее время я нащупал оптимальный вариант, о котором и хочу рассказать, но с начала расскажу о двух наиболее популярных вариантах.
Код состояния HTTP (англ. HTTP status code) — часть первой строки ответа сервера при запросах по протоколу HTTP.
Он представляет собой целое трёхразрядное десятичное число. Первая цифра указывает на класс состояния. За кодом ответа обычно следует отделённая пробелом поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа. Примеры:
Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода. В настоящее время выделено пять классов кодов состояния.
Веб-сервер Internet Information Services в своих файлах журналов, кроме стандартных кодов состояния, использует подкоды, записывая их через точку после основного. При этом в ответах от сервера данный подкод не размещается — он нужен администратору сервера, чтобы тот мог более точно определять источники проблем.
Запрос «Баг» перенаправляется сюда; см. также другие значения.
Програ́ммная оши́бка (арго баг ) — означает ошибку в программе или в системе, из-за которой программа выдает неожиданное поведение и, как следствие, результат. Большинство программных ошибок возникают из-за ошибок, допущенных разработчиками программы в её исходном коде, либо в её дизайне. Также некоторые ошибки возникают из-за некорректной работы инструментов разработчика, например из-за компилятора, вырабатывающего некорректный код.
Термин «программная ошибка» обычно употребляется для обозначения ошибок, проявляющих себя на стадии работы программы, в отличие, например, от ошибок проектирования или синтаксических ошибок. Отчет, содержащий информацию об ошибке также называют отчетом о проблеме (англ. ). Отчет о критической проблеме (англ. ), вызывающей аварийное завершение программы, называют крэш-репортом (англ. ).
Программные ошибки локализуются и устраняются в процессе тестирования и отладки программы.
Здравствуйте столкнулся с runtime ошибкой которая говорит следущее:
Вызвано исключение по адресу 0x007C3AD9 в home_oop_inheritance_virtual_metod_spd_animal.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000.
Код в котором появляется ошибка:
Код родительского класса:
Это код на котором я только изучаю наследование в С++ так-что не судите строго если там есть ошибки. Буду благодарен за любую помощь.
P.S. Я решил немного изменить метод вывода.
P.S.(2) в меом случае zoo это vector
Ставлю галочку “Вкл. выход данных” но “вход данных” не реагирует
ЗЫ:На Windows 7 программа ICProg врядли будет корректно работать,да и драйвер только для ХР,может так же ложно показывать как будто что-то прошилось/прошивается
Ссылка на комментарий
Ну может из под винды седьмой и не проходит тест, но ведь и красный светодиод не гаснет. Прошивать пробовал, ошибка выскакивает:
Пробовал и WinPic800, пишет аппаратная часть не обнаружена. Ну и не шьет, такуюже ошибку выдает.
Изменено 27 мая, 2012 пользователем gudzon-m
ЗЫ:А зеленый светодиод светиться?
Изменено 28 мая, 2012 пользователем grils
Материалы вебинара «Источники питания MORNSUN: новинки для промавтоматики и оптимальные решения для телекоммуникации»
Транзисторы впаяны правильно, и живые, светодиоды тоже правильно впаяны, зеленый горит. Ошибка с дровами естественно имеет место быть, но если запустить прогу с правами администратора то все в порядке, ошибки нет. Да и биты защиты я не выставлял. В диспетчере устройтсв, после установки драйвера, должно что-то появиться? Домустим от программы WinPic800 а диспетчере устройств, появилась запись Hardware WinPic800. И еще, как проверить тестером COM-порт? Что бы, допустим, что-то нажал и на таком-то контакте появилось столько-то вольт.
Изменено 28 мая, 2012 пользователем gudzon-m
Вебинар «Мощные модульные системы питания MEAN WELL 3+N. Новинки и хиты» (22.06.2023)
Приглашаем 22 июня на вебинар, посвященный подходу компании MEAN WELL к созданию мощных управляемых систем низковольтного и высоковольтного питания и зарядных установок для промышленного, технологического, телекоммуникационного, медицинского, радиопередающего и другого оборудования, а также для систем альтернативной энергетики.
А проверяется с помощью этой методики http://5v.ru/exp-tst.htm
Замена DC/DC-преобразователями MORNSUN изделий европейских производителей
На семерке прекрасно работает что WinPic что Icprog .
Жить значит делать вещи, а не приобретать их (Аристотель)
ИБП MEAN WELL серии DRC-180 на DIN-рейку – новое решение для пожарно-охранных систем
Обе программы прекрасно работают и на Vista. Да, WinPic создаёт запись в диспетчере устройств. У IC-Prog в настройках программатора ставлю птичку на “Используя драйвер Windows”, чтоб не возникала. В диспетчере устройств выбранный COM-порт хоть свободный? А то обе программы “воевали” у меня с портами модема и “синезуба”, пришлось переназначить другие номера портов (модему и “синезубу”).
Что вообще без ошибок?Какая у вас версия ICProg?
Абсолютно без ошибок . Сейчас стоит эта , что в архиве . Но винда 64-х битка . Может и на 32 работать будет , не знаю . Для семерки 32-х битной ставить надо IcProg тот который вместе с драйвером в одной папке идет .
Изменено 31 мая, 2012 пользователем nikolai_kuzmenko
Изменено 31 мая, 2012 пользователем grils
Тогда черт его знает чем вам помочь . У меня проблем ни каких не возникало , Вот сейчас буду пики шить , все без проблем .
Пост №32, я уже писал об этом – “чтоб не возникала”.
2. А теперь в настройках.
здравствуйте.извините за,может тупые вопросы.
решил начать осваивать МК. начал с PIC.собрал extrapic,установил ic prog 1.06
вставил в панель pic16f876a,запустил запись,показал запись прошла успешно.
но я думаю что мк не прошился.так как что с мк что без запись,проверка проходит успешно.
скажите,прог видит какой МК подключен?как еще можно проверить прошит мк или нет?
зы.собираю ESR-meter от GO.
Что я не пойму, extrа pic + ic prog должны видеть подключенный МК?
ура!запустил я esr-meter!осталось настроить его.
походу глюк был с ic prog.переустановил и мк прошился.
это моя первая конструкция на МК!
Изменено 20 июня, 2012 пользователем войтов
Здравствуйте уважаемые форумчане. Очень хочется собрать программатор Extra-PIC+ с сайта Моя ссылка Немного изменил ПП прошу проверить меня на ошибки. Буду очень благодарен
Все можно наладить, если вертеть в руках достаточно долго!
Если ничто другое не помогает, прочтите, наконец, инструкцию!
И так все прекрасно работает!
Форум РадиоКот • Просмотр темы — Ошибка при программировании pic16f628a
Согласен с chip-chip — затерта калибровочная константа. Но это причина сообщения «не найдено установки осциллятора». А вот «ошибка проверки по адресу 0000» говорит о проблемах с программатором.
По моему личному опыту — icprog убог, к тому же он отлично программирует пустой разьем COM-порта — никакой обратной связи нет. Постоянно с ним проблемы были — то нормально прошивал, то через раз, то вообще не хотел. Установка задержек ничего не меняла кроме скорости.
Установите WINPIC800 — он определяет и тип контроллера и синхронный обмен данными осуществляет — прошивает мгновенно без всяких там задержек.
Чтобы убедиться, что стерта калибровочная константа — можете выбрать для эксперемента внешний осциллятор, и сообщение про значение осциллятора исчезнет, если мы правы. А в остальном — WINPIC800 — настроить, и выбрать в меню где-то — «определить тип контроллера», если с железом всё ОК — он выдаст PIC16F676, если выдаст UNKNOWN — значит железо не работает.
Как вариант — можно попытаться укоротить com-кабель, у меня на длинном кабеле вообще ничего не работает, укоротил его до 10см — всё нормально и стабильно.
Изменено 7 октября, 2012 пользователем tcoder
Проблема с зашивкой PIC. Знач так: я с пиками не дружу и прошивку в него вливаю впервые. До этого у меня был ВиллемПРО, но шота после заливки прошивки ПИК не работает нормально ссылка скрыта от публикации / , при правильном монтаже.Но это так, прелюдия. Так вот, объясните мне — незнающему, как заливать прошивку в ПИК с помошью поньки? Я собрал SIPROG и адаптер под него, схема прикреплена, но шота не могу я ничё правильно залить. Всё время пишет «Ошибка записи». При этом туды ничё вообще не пишется. Т.е. допустим пик пустой внутри. При считывании буфер пустой. На пальцах это так:
FF FF FF FF FF FF FF FF — FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF — FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF — FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF — FF FF FF FF FF FF FF FF
ну и т.д. всё остальное ессно тоже эФки.
Так вот я в винхексе делаю файл произвольным размером, не превышающим ессно объём внутренней памяти состоящий из
11 11 11 11 11 11 11 11 — 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 — 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 — 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 — 11 11 11 11 11 11 11 11
ит.д. При попытке записи, идёт операция записи, и в конце, после верификации, выдаётся сообщение «Ошибка записи». После того, как прочитывается результат, то в итоге в микросхеме произошли лишь следующие изменения:
11 11 FF FF FF FF FF FF — FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF — FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF — FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF — FF FF FF FF FF FF FF FF
Добавлено Monday, 10 December 2007
Всё сделал как тут ссылка скрыта от публикации , ссылка скрыта от публикации описано, я понькой раньше не пользовался!
Похожие темы
Отправлено 02 September 2010 — 15:09
Вот собрал программатор-
Прикрепленные файлы
Отправлено 02 September 2010 — 15:13
Отправлено 02 September 2010 — 16:45
Einstein,а ты программатор настроил?
Отправлено 02 September 2010 — 17:55
Отправлено 11 September 2010 — 21:27
icprog но выдаёт ошибку :ошибка проверки по адресу 0000h !!! Пробовал и WinPic800. Что делать???
А делать надо следующее — в icprog в настройках, отключить опцию «Проверка после программирования», а оставить включенной опцию «Проверка при программировании» или перед программированием снять галочки с CP и CPD в битах конфигурации. Но в Вашем случае, даже после того как вы прошили контроллер и получили выше указанную ошибку программа записана в контроллер и работоспособна, так что можете смело ставить эти МК и испытывать девайс.
Отправлено 11 September 2010 — 22:22
Необходимо подтянуть 10 ногу МК через резистор на землю на 1 Ком и всё будет работать.
Отправлено 16 October 2010 — 16:45
Программатор сам заработал когда я заменил шнур с короткого на длинный!!! Всем Спасибо
Отправлено 09 March 2013 — 13:40
Собрал прогроматор в точности по схеме. Настроил программу. Подключал через переходник USB — COM.Наченаю шить, вроде шьет, но довольно долго, около часа. Процес идет, а после выдает ошибку, не верный ID устройства. В чем может быть причина? Шил PIC16F84A. ЗА РАНЕЕ СПОСИБО!
Вот на фото прогроматор и переходник:
Отправлено 13 April 2013 — 14:55
даный програматор неработает с переходником USB-COM port только напрямую к компорту и то надежно только в старых системах в новых может быть ограничение по току для порта а питание програматор берет из порта поэтому работать небудет
В языках программирования, в которых отсутствует механизм обработки исключений (например, в языке С), коды ошибок часто хранятся как глобальные переменные с именами такими как errno. Коды ошибок обычно обозначаются номерами, каждый из которых идентифицирует определенную исключительную ситуацию. В приложении, которое использует коды ошибок, каждая функция обычно определяет один код возврата, который указывает на ошибку общего значения. Получив этот обобщенный код возврата программист может проверить значение, находящееся в глобальном коде ошибки для определения условий, которые привели к возникновению исключительной ситуации. Например, при неудачной попытке открыть файл, функция может установить глобальный код ошибки, указывающий на причину ошибки и возвратить некорректный указатель на файл. Следующий пример показывает как код ошибки может быть использован для описания причины ошибки:
/* попытка открыть файл на чтение */
/* если файл не может быть открыт, напечатать номер ошибки и сообщение*/
“Cannot open file, error %d, %s
/* Альтернативно можно использовать perror(), который обеспечивает ту же функциональность */
“Cannot open file”
Так как обычно коды ошибок — глобальные переменные, то они могут быть доступны из любой точки программы. Так же как и с другими глобальными переменными, эта простота доступа может быть источником проблем в многопоточной среде. В связи с тем, что в глобальные переменные могут записывать одновременно несколько потоков, это может привести к состоянию гонки. Для решения этой проблемы, POSIX определяет переменную errno как переменную локальную к потоку (thread-local variable).
Поиск и исправление ошибок
Для отладки программы (англ. ) разработчиками ПО используются специальные программы-отладчики (англ. ). Например, в операционной системе Windows можно использовать программу WinDbg из пакета Microsoft Debugging Tools for Windows. Для GNU/Linux и ряда других UNIX-подобных операционных систем существует отладчик GDB (GNU Debugger).
Основные документы по протоколу HTTP (по убыванию даты публикации)
Документы по расширениям и обновлениям протокола HTTP (по убыванию даты публикации)
Этимология термина «баг»
«Так было со всеми моими изобретениями. Первый шаг — интуиция, которая приходит как вспышка, затем возникают трудности — устройство отказывается работать, и именно тогда проявляются «жучки» — как называют эти мелкие ошибки и трудности — и требуются месяцы пристального наблюдения, исследований и усилий, прежде чем дело дойдёт до коммерческого успеха или неудачи».
Во время Второй мировой войны словом именовали проблемы с радарной электроникой.
В этот класс выделены коды, информирующие о процессе передачи. При работе через протокол версии 1.0 сообщения с такими кодами должны игнорироваться. В версии 1.1 клиент должен быть готов принять этот класс сообщений как обычный ответ, но серверу отправлять что-либо не нужно. Сами сообщения от сервера содержат только стартовую строку ответа и, если требуется, несколько специфичных для ответа полей заголовка. Прокси-серверы подобные сообщения должны отправлять дальше от сервера к клиенту.
Сообщения данного класса информируют о случаях успешного принятия и обработки запроса клиента.
В зависимости от статуса сервер может ещё передать заголовки и тело сообщения.
Коды этого класса сообщают клиенту, что для успешного выполнения операции необходимо сделать другой запрос, как правило, по другому URI. Из данного класса пять кодов 301, 302, 303, 305 и 307 относятся непосредственно к перенаправлениям. Адрес, по которому клиенту следует произвести запрос, сервер указывает в заголовке Location. При этом допускается использование фрагментов в целевом URI.
Поведение клиентов при различных перенаправлениях описано в таблице:
Класс кодов 4xx предназначен для указания ошибок со стороны клиента. При использовании всех методов, кроме HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя.
Сервер вернул ошибку 403 при попытке просмотра каталога «cgi-bin», доступ к которому был запрещён
Пример ошибки 502 Bad Gateway
Коды 5xx выделены под случаи необработанных исключений при выполнении операций на стороне сервера. Для всех ситуаций, кроме использования метода HEAD, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю.
Отчёты об ошибках
Основная масса ошибок обычно отлаживается на этапе компиляции и тестирования программы. Однако некоторая часть ошибок всё же попадает в публикуемую версию и проявляется на компьютерах конечных пользователей в процессе эксплуатации ПО. Для повышения качества программного обеспечения пользуются специальными программами, цель которых — отловить ошибку в целевом приложении, собрать необходимую информацию о её симптомах и отправить отчёт по интернету к разработчикам данного ПО.
HTTP статусы
Если почитать апологетов REST, то для кодов ошибок надо использовать HTTP статусы, а текст ошибки отдавать в теле или в специальном заголовке. Например:
Если у вас примитивная бизнес-логика или API из 5 url, то в принципе это нормальный подход. Однако как-только бизнес-логика станет сложнее, то начнется ряд проблем.
Http статусы предназначались для описания ошибок при передаче данных, а про логику вашего приложения никто не думал. Статусов явно не хватает для описания всего разнообразия ошибок в вашем проекте, да они и не были для этого предназначены. И тут начинается натягивание “совы на глобус”: все начинают спорить, какой статус ошибки дать в том или ином случае. Пример: Есть API для task manager. Какой статус надо вернуть в случае, если пользователь хочет взять задачу, а ее уже взял в работу другой пользователь? Ссылка на http статусы. И таких проблемных примеров можно придумать много.
REST скорее концепция, чем формат общения из чего следует неоднозначность использования статусов. Разработчики используют статусы как им заблагорассудится. Например, некоторые API при отсутствии сущности возвращают 404 и текст ошибки, а некоторые 200 и пустое тело.
Бэкенд разработчику в проекте непросто выбрать статус для ошибки, а клиентскому разработчику неочевидно какой статус предназначен для того или иного типа ошибок бизнес-логики. По-хорошему в проекте придется держать enum для того, чтобы описать какие ошибки относятся к тому или иному статусу.
Когда бизнес-логика приложения усложняется, начинают делать как-то так:
Из-за ограниченности http статусов разработчики начинают вводить “свои” коды ошибок для каждого статуса и передавать их в теле ответа. Другими словами, пользователю API приходится писать нечто подобное:
Из-за этого ветвление клиентского кода начинает стремительно расти: множество http статусов и множество кодов в самом сообщении. Для каждого ошибочного http статуса необходимо проверить наличие кодов ошибок в теле сообщения. От комбинаторного взрыва начинает конкретно пухнуть башка! А значит обработку ошибок скорее всего сведут к сообщению типа “Произошла ошибка” или к молчаливому некорректному поведению.
Многие системы мониторинга сервисов привязываются к http статусам, но это не помогает в мониторинге, если статусы используются для описания ошибок бизнес логики. Например, у нас резкий всплеск ошибок 429 на графике. Это началась DDOS атака, или кто-то из разработчиков выбрал неудачный статус?
Итог: Начать с таким подходом легко и просто и для простого API это вполне подойдет. Но если логика стала сложнее, то использование статусов для описания того, что не укладывается в заданные рамки протокола http приводит к неоднозначности использования и последующим костылям для работы с ошибками. Или что еще хуже к формализму, что ведет к неприятному пользовательскому опыту.
На все 200
Есть другой подход, даже более старый, чем REST, а именно: на все ошибки связанные с бизнес-логикой возвращать 200, а уже в теле ответа есть информация об ошибке. Например:
На самом деле формат зависит от вас или от выбранной библиотеки для реализации коммуникации, например JSON-API.
Звучит здорово, мы теперь отвязались от http статусов и можем спокойно ввести свои коды ошибок. У нас больше нет проблемы “впихнуть невпихуемое”. Выбор нового типа ошибки не вызывает споров, а сводится просто к введению нового числового номера (например, последовательно) или строковой константы. Например:
Клиентские разработчики просто основываясь на кодах ошибок могут создать классы/типы ошибок и притом не бояться, что сервер вернет один и тот же код для разных типов ошибок (из-за бедности http статусов).
Обработка ошибок становится менее ветвящейся, множество http статусов превратились в два: 200 и все остальные (ошибки транспорта).
В некоторых случаях, если есть библиотека десериализации данных, она может взять часть работы на себя. Писать SDK вокруг такого подхода проще нежели вокруг той или иной имплементации REST, ведь реализация зависит от того, как это видел автор. Кроме того, теперь никто не вызовет случайное срабатывание alert в мониторинге из-за того, что выбрал неудачный код ошибки.
Но неудобства тоже есть:
В некоторых случаях данный подход вырождается в RPC, то есть по сути вообще отказываются от использования url и шлют все на один url методом POST, а в теле сообщения передают все параметры. Мне кажется это не правильным, ведь url это прекрасный именованный namespace, зачем от этого отказываться, не понятно?! Кроме того, RPC создает проблемы:
Итог: Для сложной бизнес-логики с большим количеством типов ошибок такой подход лучше, чем расплывчатый REST, не зря в проектах c “разухабистой” бизнес-логикой часто именно такой подход и используют.
Смешанный
Возьмем лучшее от двух миров. Мы выберем один http статус, например, 400 или 422 для всех ошибок бизнес-логики, а в теле ответа будем указывать код ошибки или строковую константу. Например:
Тело ответа для удачного запроса у нас имеет произвольную структуру, а вот для ошибки есть четкая схема. Мы избавляемся от избыточности данных (поле ошибки/данных) благодаря использованию http статуса в сравнении со вторым вариантом. Клиентский код упрощается в плане обработки ошибки (в сравнении с первым вариантом). Также мы снижаем его вложенность за счет использования отдельного http статуса для ошибок бизнес логики (в сравнении со вторым вариантом).
Мы можем расширять объект ошибки для детализации проблемы, если хотим. С мониторингом все как во втором варианте, дописывать парсинг придется, но и риска “стрельбы” некорректными alert нету. Для документирования можем спокойно использовать Swagger и ApiDoc. При этом сохраняется удобство использования инструментов разработчика, таких как Chrome DevTools, Postman, Talend API.
Итог: Использую данный подход уже в нескольких проектах, где множество типов ошибок и все крайне довольны, как клиентские разработчики, так и бэкендеры. Внедрение новой ошибки не вызывает споров, проблем и противоречий. Данный подход объединяет преимущества первого и второго варианта, при этом код более читабельный и структурированный.
Самое главное какой бы формат ошибок вы бы не выбрали лучше обговорить его заранее и следовать ему. Если эту вещь пустить на “самотек”, то очень скоро обработка ошибок в проекте станет невыносимо сложной для всех.
P.S. Иногда ошибки любят передавать массивом
Но это актуально в основном в двух случаях:
Значение и классификация ошибок программного обеспечения
В зависимости от этапа разработки ПО, на котором выявляется ошибка, выделяют:
По времени появления:
По месту и направлению:
В зависимости от характера ошибки, программы и среды исполнения, ошибка может проявляться сразу или наоборот — долгое время оставаться незамеченной (например Проблема 2038 года).
Также ошибка может проявляться в виде уязвимости, делающей возможным несанкционированный доступ к системе или DoS-атаку.
Ниже представлен обзорный список всех описанных в данной статье кодов ответа:
Диаграмма принятия веб-сервером решений на основе заголовков
Статистика по кодам ответа, сгенерированная анализатором логов Webalizer