Рекомендуемый подход к обработке SqlExceptions в приложениях дб

RUDP - Надежный Протокол пользовательских дейтаграмм

Это обеспечивает:

  • Подтверждение полученных пакетов
  • Работа с окнами и управление перегрузкой
  • Повторная передача потерянных пакетов
  • Сверхбуферизация (Быстрее, чем потоковая передача в режиме реального времени)

Это кажется немного более настраивающимся относительно содержания alives тогда ENet, но это не дает Вам как многие опции (т.е. все данные надежны и упорядочиваются не только биты, которые Вы решаете, должен быть). Это выглядит довольно прямым для реализации.

6
задан svinto 12 September 2009 в 15:16
поделиться

8 ответов

Сообщения об ошибках не приравниваются к исключениям. Сообщение об ошибке - это то, что пользователь должен найти информативным и наиболее важным действенным . В User Experience Guidelines есть несколько рекомендаций по сообщениям об ошибках. Я рекомендую вам прочитать. У Apple также есть хорошие общие рекомендации в Написание хороших предупреждающих сообщений .

Вы сразу заметите, что большинство, если не все, SQL-ошибки не хороших сообщений для конечных пользователей. «Нарушение ограничения FKXF # 455» - Плохая ошибка для конечного пользователя. «Файловая группа заполнена» - плохая ошибка для конечного пользователя. «Тупик» - то же самое. Хорошие приложения делают то, что разделяют роли пользователей. Эти ошибки должны видеть администраторы, а не конечные пользователи. Таким образом, приложение всегда регистрирует полную ошибку SQL со всеми деталями, в конечном итоге уведомляет администратора, а затем отображает другую ошибку для пользователя, например, «Произошла системная ошибка, администратор был уведомлен».

Если конечный пользователь может предпринять действия по ошибке SQL, то вы можете отобразить ему сообщение об ошибке, указав, что делать, чтобы исправить проблему (например, изменить дату счета-фактуры во входных данных, чтобы удовлетворить ограничению). Но даже в этом случае в большинстве случаев вам не следует отображать ошибку SQL напрямую пользователю (вы уже видели очень вескую причину, почему нет: локализация). Я понимаю, что это создает гораздо большую нагрузку на вашу команду разработчиков. Вы должны знать, какие ошибки могут быть приняты пользователем в каждом случае из множества ошибок, которые вы можете обнаружить. Это хорошо известно, и именно поэтому хорошие менеджеры программ знают, что около 80% кода обрабатывает случаи ошибок, и почему приложение "готово" обычно означает, что выполнено 20%. Вот что отличает отличные приложения от обычных: как они себя ведут, когда что-то идет неправильно .

Я предлагаю начать с принципа прогрессивного раскрытия информации . Отображение общего сообщения об ошибке с сообщением «операция не удалась». Предложите отобразить дополнительные сведения, если пользователь нажмет кнопку «Показать подробности ...» в диалоговом окне сообщения об ошибке и отобразит коллекцию SqlError (кстати, вы должны всегда регистрировать и отображать целиком Коллекция SqlError SqlException.Errors , а не SqlException). Используйте SqlError. Number для добавления логики в блок перехвата, который определяет, может ли пользователь что-либо делать с ошибкой (решать, является ли ошибка действующей) и добавлять соответствующую информацию.

К сожалению, пикси-пыль нет. Вы касаетесь истоков того, что, вероятно, является самой сложной частью вашего проекта.

1
ответ дан 8 December 2019 в 13:47
поделиться

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

Обычно в SqlException вы также получаете код ошибки SQL или что-то еще.

Лучшим подходом, вероятно, было бы иметь отдельную таблицу в вашей базе данных, которая в основном отображает те технические ошибки SQL, которые могут произойти с более значимыми, ориентированными на пользователя сообщениями. Например, если ваша ошибка SQL говорит что-то вроде «fk нарушение blablabaal», у вас может быть запись в вашей «UserErrorTable», которая сопоставляет это с сообщением пользователя, говорящим «не удалось удалить пользователя (this.and.that), скорее всего потому, что .. ... (он все еще член команды) "или что-то в этом роде.

Затем вы можете попытаться перехватить эти SqlExceptions на своем бизнес-уровне,

3
ответ дан 8 December 2019 в 13:47
поделиться

Обычно мы пишем какой-то переводчик в наших проектах. Мы сравниваем сообщение об исключении SQL с некоторыми предопределенными шаблонами и показываем эквивалентное сообщение пользователю

1
ответ дан 8 December 2019 в 13:47
поделиться

Для этого нужно написать хранимую процедуру и использовать TRY и CATCH . Используйте RAISERROR для создания собственных пользовательских сообщений и проверьте код ошибки в SqlException .

2
ответ дан 8 December 2019 в 13:47
поделиться

К сожалению, здесь нет простого ответа.

Объем работы будет зависеть от согласованности сообщений об ошибках, поступающих с бизнес-уровня. Вам потребуется выполнить некоторую форму перевода «технического» сообщения об ошибке в ваше ориентированное на пользователя сообщение.

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

6
ответ дан 8 December 2019 в 13:47
поделиться

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

Но в вашем конкретном примере с работодателем я должен призвать вас не полагаться только на SqlException. Прежде чем пытаться удалить сотрудника, вы должны проверить, является ли он / она частью какой-либо команды, менеджером и т. Д. Это значительно улучшит удобство использования вашего приложения.

Псевдо:

Employee e;
try {

   IEnumerable<Team> teams = Team.GetTeamsByEmployee(e);
   if (teams.Count() > 0) {
       throw new Exception("Employee is a part of team "+ String.Join(",", teams.Select(o => o.Name).ToArray());
   }

   IEnumerable<Employee> managingEmployees = Employee.GetEmployeesImManaging(e);
   if (managingEmployees.Count() > 0) {
       throw new Exception("Employee is manager for the following employees "+ String.Join(",", managingEmployees.Select(o => o.Name).ToArray());
   }

   Employee.Delete(e);
} catch (Exception e) {
   // write out e
}
1
ответ дан 8 December 2019 в 13:47
поделиться

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

Я склонен классифицировать ошибки как ожидаемые или непредвиденные. Если вы можете предвидеть ошибку и , вы хотите обработать ее с помощью четкого консисного сообщения, например, с вашей ситуацией «удалить сотрудника», вам придется соответствующим образом спланировать и закодировать. По их определению, вы не можете сделать это для непредвиденных ошибок - обычно здесь на помощь приходит TRY / CATCH.

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

Альтернатива, основанная на TRY ... CATCH ... быть, чтобы проверить номер ошибки в блоке catch. Если это «невозможно удалить из-за внешнего ключа», вы можете запросить дочерние таблицы и сгенерировать сообщение, а если это какая-то другая непредвиденная ошибка, вам придется вернуться к общему сообщению.

(Предупреждение: иногда, когда возникает ошибка, SQL выдаст два сообщения об ошибках подряд [одно из них - нарушение ограничения FK?], И в этих ситуациях различные функции ERROR () будут возвращать данные только для второго и неизменно менее полезного сообщения. Это очень неприятно, но с этим ничего не поделаешь.)

1
ответ дан 8 December 2019 в 13:47
поделиться

Короткий ответ - «не надо». Позвольте ошибкам всплыть в глобальную обработку ошибок / регистрацию. Правила проверки и бизнес-правила должны, как правило, исключать исключения из базы данных, так что лучше отказываться от ошибок и не отправлять грязные данные. Транзакции тоже помогают.

2
ответ дан 8 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: