Мы создаем веб-сервис (SOAP, .Net), который будет взаимодействовать (главным образом) с собственными клиентами (windows, C ++), и нам интересно, как лучше всего сообщить клиенту об ошибках (например, SomethingBadHappened, например, служба входа недоступна) или что-то вроде пользователя не найден), и он не смог решить, выдать ли клиенту исключение или использовать какую-либо модель кода ошибки для выполнения вышеупомянутого.
Что бы вы предпочли при обработке на стороне клиента: получение кода ошибки или обработка исключения ServerFault, которое содержит причину ошибки?
1) Почему мы думаем об исключении: потому что это сделает код на стороне сервера более единообразным
2) Почему мы думаем о кодах ошибок: потому что мы думаем, что это имеет больше смысла с точки зрения стороны клиента.
Если 2) действительно верно, мы бы хотели использовать коды ошибок, а не исключения? Это тот случай, здесь?
Кроме того, изменится ли ответ, если мы будем говорить с управляемыми клиентами вместо собственных клиентов?
источник
Ответы:
У SOAP есть концепция сбоев : вы можете преобразовать исключение в сбой на стороне сервера, а на клиентском прокси-сервере сбой снова может быть преобразован обратно в исключение. Это замечательно работает в WCF и Java-стеке, не может комментировать нативные клиенты C ++.
Что касается передовой практики SOA, определите одну общую ошибку и несколько конкретных ошибок только в том случае, если клиенту необходимо обработать определенный тип ошибки по-другому. Никогда не отправляйте трассировку стека исключений клиенту в производственном развертывании. Это связано с тем, что теоретически трассировка сервера не имеет значения для клиента, а также по соображениям безопасности. Зарегистрируйте полную ошибку и трассировку стека на сервере и отправьте уникальную ссылку на журнал в сбое. В WCF я использую блок обработки исключений Microsoft из Enterprise Library для генерации guid, а также для преобразования исключения в ошибку SOAP.
Проверьте руководство в Microsoft Patterns and Practices .
источник
Недавно я сделал веб-сервис с библиотеками Java 6, который может сообщить об исключительной ситуации вызывающей стороне (я не изучал, как это происходит автоматически).
Возможность заставить клиента предоставлять трассировку стека в отчете об ошибках для разработчика была очень полезной (в отличие от получения приблизительной отметки времени, а затем ее поиска в журналах, если вы ее регистрировали).
Итак, с точки зрения разработчиков, используйте исключения.
источник
Если это веб-служба, вы не можете заставить сервер выдать исключение, которое будет перехвачено клиентом. В интерфейсе ваш сервер в основном должен возвращать некоторый код ошибки, даже если это строка, которая говорит
An exception occurred. Type %s, message %s, stack trace %s
.Что касается клиентской стороны, вы можете попросить код чтения ответа проверить ответ, чтобы увидеть, содержит ли он ошибку, и вызвать исключение на стороне клиента. Это очень хороший способ сделать это, по крайней мере, на языках с хорошей обработкой исключений. C ++, однако, не имеет хорошей обработки исключений, и это хорошая идея, чтобы держаться как можно дальше от исключений C ++. Если вы не можете использовать лучший язык, просто придерживайтесь кодов ошибок.
источник