Подтвердить что ты не робот

Ошибка SOAP или объект результатов?

Я обсуждал это с сотрудником, и мы не могли договориться, поэтому я хотел получить ваши мысли. У меня есть свои мнения по этому поводу, но я не буду его испортить.

Когда мне следует возвращать ошибку SOAP и когда я должен возвращать объект, содержащий информацию об ошибке? Предположим, что это для общей веб-службы, которая может быть использована различными системами (.NET, Java, независимо). Объект result имеет флаг isError, тип errorType (аналогичный определенному типу исключений) и сообщение.

Некоторые моменты, которые следует учитывать:

  • Является ли ошибка проверки данных ошибкой?
  • Должна ли быть комбинация ошибок (для очень исключительных случаев) и объекта результатов (для "ожидаемых" ошибок)?
  • Как бы вы группировали ошибки SOAP (критическая [нулевая ссылка] против проверки [неправильный почтовый индекс])?
  • Fail-fast vs необходимо помнить, чтобы проверить наличие ошибки
  • Лучшие практики, шаблоны, стандарты и т.д.

Ссылки на статьи действительны. Даже если это звучит так, как будто я хочу ваше мнение, , пожалуйста, придерживайтесь фактов (лучше x из-за y и z...)

4b9b3361

Ответ 1

Большинство клиентов SOAP преобразуют ошибки в исключение среды выполнения (если это то, что поддерживает клиентский язык). Имея это в виду, я думаю, вы могли бы перефразировать вопрос как "Когда я хочу, чтобы исключить исключение, вместо того, чтобы возвращать значение ошибки"? Я уверен, что вы можете найти много мнений об этом дизайне API в целом и в этой теме в частности.

Тем не менее, возврат ошибки обычно не помогает клиенту:

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

  • Если вы не делаете свои коды ошибок частью WSDL; у клиента не будет документации о том, что они есть или когда они происходят. Типизированные ошибки являются частью WSDL и, следовательно, (в некоторой степени) самодокументируемыми.

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

Чтобы ответить на ваши конкретные вопросы:

  • Ошибка проверки является ошибкой. Представьте, если вы вызываете веб-службу от клиента AJAX с ограниченной способностью обработки ошибок; вы хотите, чтобы служба вернула код HTTP 5xx, а не код успеха 400 с неожиданным ответом.

  • Нет. API должны обеспечивать согласованные интерфейсы сообщений об ошибках. Дизайн WSDL - это дизайн API. Принуждение клиента к реализации двух разных обработчиков ошибок не облегчает жизнь клиенту.

  • Конструкция сбоя должна отражать вашу модель запроса/ответа и отображать информацию, соответствующую абстракции службы. Не создавайте ошибку NullReference; спроектируйте XYZServiceRuntimeFault. Если клиенты часто предоставляют неверные запросы, создайте InvalidRequestFault с соответствующими подклассами, чтобы клиенты могли быстро определить, где находятся недопустимые данные.

Ответ 2

Объект результатов должен содержать только результаты. Если ваш объект результата предоставляет список ошибок, которые произошли в другой системе, это пример того, когда вы можете иметь флаг "isError"; иначе вы не можете, потому что результат действителен или нет.

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

Таким образом, вы должны использовать объекты результатов для результатов и SOAP Faults для чего-либо, что препятствует действительному объекту результата; включая, но не ограничиваясь, ошибки, ошибки проверки, предупреждения, ошибки шины и т.д.

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

Ответ 3

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

Существуют серые области, которые можно было бы разумно рассматривать как исключения и как ошибки результата в зависимости от потребностей клиента. Затем вы можете предоставить параметр службе, которая изменяет способ возврата этих типов ошибок. По умолчанию используется ошибка SOAP, но если клиент устанавливает параметр для получения результатов ошибки, он указывает, что он готов обрабатывать это как часть результата. Для меня ошибки проверки в этой серой области. Для большинства клиентов они должны рассматриваться как неисправности, но если клиент хочет использовать данные для разметки пользовательского интерфейса с ошибками проверки, тогда возврат ошибок проверки, поскольку часть результата может быть более полезной.  

Ответ 4

Правило, которое я придерживаюсь в дизайне обслуживания, следующее:

  • бизнес-уровень ответ (даже бизнес-исключения) в объекты ответа
  • технический/уровень интеграции ошибки в мыльной ошибке

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

Мыльные ошибки должны вызывать предупреждение/действие поддержки посредством мониторинга.