Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Para programadores C tradicionais, os erros geralmente são retornados por meio de valores de retorno ou um parâmetro especial [out] 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 de retorno RPC são simplesmente inteiros longos. Eles não têm nenhum significado especial como erros (note 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; tenta desmarechar todos os argumentos [dentro, fora] e [fora]. A semântica de falha dos identificadores de contexto também é diferente. O pacote devolvido ao cliente é essencialmente um pacote de sucesso, 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 muitas vezes não consegue discernir onde a chamada falhou.
Indicar erros em rotinas de servidor RPC lançando exceções de SEH (Structured Exception Handling - Tratamento de Exceções Estruturadas) (não C++) é uma abordagem muito melhor. Quando uma exceção SEH é lançada, o controle vai diretamente para o tempo de execução RPC. Às vezes, um erro ocorre profundamente em uma rotina que não pode ser limpa corretamente e precisa indicar um erro ao chamador. A rotina deve retornar um erro para seu chamador, que por sua vez pode retornar um erro para seu chamador e assim por diante. No entanto, a última rotina de servidor na pilha deve lançar uma exceção antes de retornar ao RPC para indicar ao RPC que ocorreu um erro.
Tópicos relacionados