Рекомендации по созданию шаблона кодов ошибок для корпоративного проекта в C # [закрыто]

43

Я работаю над корпоративным проектом, который будет развернут во многих малых и средних предприятиях и предприятиях.
Поддержка этого проекта будет затруднена, и поэтому я хочу создать шаблон кодирования для ошибок (например, коды состояния HTTP ). Это позволит сотрудникам службы поддержки обращаться к документам и устранять проблемы как можно скорее.

Каковы лучшие практики и рекомендации для этого?
Любая помощь для этого будет полезна.

Pooya
источник
1
Есть слишком много возможных ответов, или хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или выделить проблему, на которую можно ответить в нескольких параграфах. И что вы пробовали до сих пор.
Бен Макдугалл
Зависит от того, как ваш бизнес структурирован. В C # мы всегда давали пользователю возможность отправить нам StackTrace по почте или скопировать / вставить его из деталей сообщения об ошибке (у нас не было жестких требований безопасности).
Сокол

Ответы:

69

Существует разница между кодами ошибок и значениями ошибок. Код ошибки предназначен для пользователя и службы поддержки. Возвращаемое значение ошибки - это метод кодирования, указывающий, что в вашем коде обнаружена ошибка.

Можно реализовать коды ошибок, используя возвращаемые значения ошибок, но я бы посоветовал против этого. Исключения представляют собой современный способ сообщения об ошибках, и нет никаких причин, по которым они не должны содержать в себе код ошибки.

Вот как я бы это организовал (обратите внимание, что пункты 2-6 не зависят от языка):

  1. Используйте пользовательский тип исключения с дополнительным ErrorCodeсвойством. Функция catch в основном цикле будет сообщать об этом поле обычным способом (файл журнала / всплывающее окно с ошибкой / ответ об ошибке). Используйте один и тот же тип исключения во всем вашем коде.
  2. Не начинайте с 1 и не используйте начальные нули. Держите все коды ошибок одинаковой длины, чтобы можно было легко найти неправильный код ошибки. Начиная с 1000 обычно достаточно хорошо. Возможно, добавьте начальную букву «Е», чтобы их можно было легко идентифицировать для пользователей (особенно полезно, когда служба поддержки должна указывать пользователям, как распознать код ошибки).
  3. Держите список всех кодов ошибок, но не делайте этого в своем коде . Держите короткий список на вики-странице для разработчиков, который они могут легко редактировать, когда им нужен новый код. Справочная служба должна иметь отдельный список в своей вики.
  4. Не пытайтесь применять структуру кодов ошибок. Ошибки всегда будут трудно классифицировать, и вы не хотите часами обсуждать, должна ли ошибка быть в группе 45хх или в группе 54хх. Будьте прагматичны .
  5. Назначьте каждому коду в вашем коде отдельный код. Даже если вы думаете, что это одна и та же причина, службе поддержки может потребоваться выполнить разные действия в разных случаях. Им легче иметь «E1234: Смотрите E1235» в своей вики, чем заставить пользователя признаться в том, что он сделал неправильно.
  6. Разделите коды ошибок, если служба поддержки попросит об этом. Простая if (...) throw new FooException(1234, ".."); else throw new FooException(1235, "..");строка в вашем коде может сэкономить полчаса для справочной службы.

И никогда не забывайте, что цель кодов ошибок - облегчить жизнь службе поддержки .

Сьерд
источник
Я никогда не делал этого лично, но часто вы также видите «идентификаторы корреляции», ориентированные на экземпляр ошибки руководства, которые отображаются для пользователя и также регистрируются. Таким образом, вы можете легче найти точную ошибку в журналах, чем с приблизительным временем и кодом ошибки.
xdhmoore
Я предполагаю, что, возможно, есть способ включить код ошибки в идентификатор корреляции, чтобы он мог служить удобочитаемым кодом ошибки для службы поддержки и идентификатором экземпляра ошибки для разработчиков.
xdhmoore
Моя модель очень похожа. Но вместо «E» я добавил краткую часть приложения. В нашей документации есть, например, какое- Doc1234то время, которое может иметь главное приложение IrS1234. Так что мои сотрудники службы поддержки довольно быстро помогают пользователям.
Матиас Бургер
6

Сначала вы должны изолировать области, где могут возникнуть ошибки, и которые видны пользователю. Тогда вы можете документировать их. Это так просто.

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

Я бы рекомендовал двухэтапный подход. Во-первых, чтобы войти, войти много и много.

Во-вторых, это определить основные компоненты и их интерфейсы, а также определить, в каких основных случаях возникновения ошибок эти компоненты могут оказаться. Затем вы можете войти в систему более наглядным образом, когда одна из этих ошибок (как вы обрабатываете внутреннюю ошибку, зависит от вас). - исключения или коды ошибок здесь не имеют значения). Пользователь обычно увидит ошибку и перейдет в журналы для получения более подробной информации.

Тот же подход используется для веб-серверов и вашего примера кода ошибки http. Если пользователь видит 404 и сообщает о его поддержке, он будет искать в журналах подробную информацию о том, что происходило, какую страницу посещали, когда, и будет собирать любую другую информацию, которую он может откуда-то еще иметь, имеет смысл находиться в БД, сети или приложении.

gbjbaanb
источник
3

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

Стефан Биллиет
источник
1
Я был бы признателен человеку, который понизил этот ответ с 1 до 0, чтобы хотя бы указать причину ...
Стефан Биллиет
1
не я понизил голосование (не то, чтобы это имело значение, прекратите это), но я думаю, что существует также поддержка возвращаемых значений в языке.
gbjbaanb
2
Это важно для меня; если я ошибаюсь, я хотел бы знать, чтобы я мог узнать :-p Как вы имеете в виду, существующая поддержка для возвращаемых значений? Разве вам не пришлось бы писать сантехнику, чтобы отличить нормальное возвращаемое значение от кода ошибки? Преобразование исключения в код ошибки на границе системы - это одно, но их совмещение внутри вашей системы обычно не рекомендуется. Я полагаю, что Прагматичный Программист упоминает подобные вещи.
Стефан Биллиет
1
исключения не являются хорошим механизмом в каждом случае, но если вы решили использовать ошибки, вы можете либо добавить выходной параметр к каждому вызову, либо сделать так, чтобы важные вызовы возвращали код. Просто решите сделать это заранее, и вы золотые. Прагматически, вы в конечном итоге получаете смесь из двух - возвращение кодов ошибок на границах (так что вы не привязаны к одному языку) и внутреннее использование исключений.
gbjbaanb
6
Я не голосовал против вас (успокойтесь, иначе все должны будут повторить это :). Если вы работали или звонили в службу поддержки, гораздо проще просто набрать короткий номер, чем сообщение об ошибке. Сообщение об ошибке гарантированно изменится при устном сообщении.
Кодизм