Indicar erros por exceções
Para programadores C tradicionais, os erros normalmente são retornados por meio de valores retornados ou um parâmetro [out] especial que retorna o código de erro. Isso leva a interfaces implementadas da seguinte maneira:
long sample(...)
{
...
p = new Cbar(...);
if (p == NULL)
{
// cleanup
...
return ERROR_OUTOFMEMORY;
}
}
O problema com essa abordagem é que os valores retornados de RPC são simplesmente inteiros longos. Eles não têm nenhum significado especial como erros (observe que error_status_t não tem semântica especial no lado do servidor), o que traz implicações importantes.
Primeiro, o RPC não é alertado de que a operação falhou; ele tenta cancelar omarsal de todos os argumentos [in, out] e [out]. A semântica de falha dos identificadores de contexto também é diferente. O pacote retornado ao cliente é essencialmente um pacote de êxito, com o código de erro enterrado profundamente no pacote. Isso também significa que o RPC não usa informações de erro estendidas, portanto, o software cliente geralmente não consegue discernir onde a chamada falhou.
Indicar erros em rotinas de servidor RPC gerando exceções seh (tratamento de exceções estruturadas) (não C++) é uma abordagem muito melhor. Quando uma exceção SEH é gerada, o controle vai diretamente para o tempo de execução de RPC. Às vezes, ocorre um erro profundo em uma rotina que não pode limpo corretamente e precisa indicar um erro para o chamador. A rotina deve retornar um erro ao chamador, que, por sua vez, pode retornar um erro ao chamador e assim por diante. No entanto, a última rotina de servidor na pilha deve gerar uma exceção antes de retornar ao RPC para indicar ao RPC que ocorreu um erro.
Tópicos relacionados