Partilhar via


Indicar erros por exceções

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.

Tratamento de exceções