Estamos construindo um serviço da Web (SOAP, .Net) que falaria com (principalmente) clientes nativos (Windows, C ++) e estamos imaginando qual é a melhor maneira de comunicar erros ao cliente (por exemplo, SomethingBadHappened, como o serviço de login não disponível ou algo como usuário não encontrado) e não conseguiu decidir entre lançar uma exceção para o cliente ou usar algum tipo de modelo de código de erro para fazer o acima.
O que você preferiria no tratamento no lado do cliente: receber um código de erro ou manipular uma exceção ServerFault que contenha o motivo do erro?
1) Por que estamos pensando em exceção: porque tornaria o código do lado do servidor muito mais uniforme
2) Por que estamos pensando em códigos de erro: Porque pensamos que faz mais sentido do ponto de vista do cliente.
Se 2) for realmente verdade, provavelmente quereríamos procurar códigos de erro do que exceções? É esse o caso aqui?
Além disso, a resposta mudaria se estivéssemos conversando com clientes gerenciados em vez de clientes nativos?
fonte
Respostas:
O SOAP tem um conceito de falhas , você pode converter uma exceção em uma falha no lado do servidor e, no proxy do cliente, a falha pode ser novamente convertida em uma exceção. Isso funciona notavelmente bem na pilha metro do WCF e Java, não pode comentar em clientes C ++ nativos.
No que diz respeito às práticas recomendadas de SOA, defina uma falha genérica e poucas falhas específicas apenas se o cliente precisar tratar um determinado tipo de erro de maneira diferente. Nunca envie um rastreamento de pilha de exceção para o cliente na implantação de produção. Isso ocorre porque, em teoria, o rastreamento do servidor não tem significado para o cliente e também por razões de segurança. Registre o erro completo e o rastreamento de pilha no servidor e envie uma referência exclusiva ao log na falha. No WCF, uso o bloco Microsoft Exception Handling da Enterprise Library para gerar um guia e também converter uma exceção em falha SOAP.
Verifique as orientações em Microsoft Patterns and Practices .
fonte
Recentemente, eu fiz um serviço da web com as bibliotecas Java 6, que pode relatar uma exceção de volta ao chamador (não examinei como isso é feito automaticamente).
A capacidade de fazer com que o cliente forneça um rastreamento de pilha no relatório de erros para o desenvolvedor tem sido muito útil (em vez de obter um carimbo de data / hora aproximado e depois procurar em seus logs, se você o registrar).
Portanto, visto do ponto de vista dos desenvolvedores, use Exceções.
fonte
Se for um serviço da Web, você não poderá exatamente fazer com que o servidor lance uma exceção que será capturada pelo cliente. Na interface, seu servidor basicamente precisa retornar algum tipo de código de erro, mesmo que seja uma string que diz
An exception occurred. Type %s, message %s, stack trace %s
.Quanto ao lado do cliente, seu código de leitura de resposta pode verificar a resposta para ver se ele contém um erro e gerar uma exceção no lado do cliente. Essa é uma maneira muito boa de fazer isso, em idiomas com pelo menos um bom tratamento de exceções. O C ++, no entanto, não possui boas exceções de manipulação e é uma boa ideia ficar o mais longe possível das exceções do C ++. Se você não pode usar um idioma melhor, siga apenas os códigos de erro.
fonte