Tratamento de erros (RPC)
No RPC síncrono, um cliente faz uma chamada remota que retorna com um código de êxito ou falha. O RPC assíncrono oferece mais oportunidades para uma chamada falhar e essas falhas são tratadas de forma diferente, dependendo de onde e quando ocorrem. A tabela a seguir descreve as maneiras pelas quais uma chamada pode falhar e como ela é tratada.
Limpeza do lado do cliente
Sintoma de falha | Limpeza |
---|---|
O cliente captura uma exceção quando chama o procedimento remoto. | Nenhuma chamada à API RPC é necessária. Todo o estado RPC foi limpo. |
O cliente recebe uma notificação de chamada completa, mas quando chama RpcAsyncCompleteCall, ele recebe um código de erro. | Nenhuma chamada à API RPC é necessária. Todo o estado RPC foi limpo. |
O cliente emite um cancelamento não anulativo ou anulativo. | O cliente deve aguardar a notificação e chamar RpcAsyncCompleteCall quando a notificação chegar. |
Na limpeza do lado do servidor, um conceito fundamental é o ponto de entrega. Durante o processamento do lado do servidor de uma chamada assíncrona, alguns processamentos geralmente são executados no thread que recebeu a chamada (também conhecido como thread do dispatcher) e, opcionalmente, o thread do dispatcher coloca estado suficiente em um bloco de memória e sinaliza outro thread (também conhecido como thread de trabalho) para continuar o processamento da chamada. O momento em que o thread do dispatcher sinaliza com êxito que o thread de trabalho é chamado de ponto de entrega.
Limpeza do Lado do Servidor
Erro encontrado | Limpeza |
---|---|
Antes do ponto de entrega. | Gerar exceção. Nenhuma chamada para RpcAsyncCompleteCall é necessária. |
Após o ponto de entrega. | Chame RpcAsyncAbortCall ou, se o erro não for fatal e os resultados ainda puderem ser retornados ao cliente, RpcAsyncCompleteCall. Se a chamada da função RpcAsyncCompleteCall falhar, o runtime do RPC liberará os parâmetros. O usuário não deve acessar esses parâmetros. O thread do dispatcher não deve executar nenhum processamento substancial que possa falhar após o ponto de entrega, pois ele não pode mais anular a chamada com segurança. Especificamente, ele não deve gerar uma exceção após o ponto de desativação da mão ou o servidor pode falhar. |
Casos especiais de tratamento de erros para pipes
Há casos especiais para tratamento de erros ao usar pipes. A lista a seguir explica a origem da falha e como lidar com o erro.
Origem da falha | Como é tratado |
---|---|
O cliente chama push e a chamada falha. | Nenhuma chamada à API RPC é necessária. Todo o estado RPC foi limpo. |
O cliente chama RpcAsyncCompleteCall antes que os pipes in sejam drenados. | A chamada falha com o código de erro de preenchimento de pipe apropriado. |
O cliente chama pull e a chamada falha. | Nenhuma chamada à API RPC é necessária. Todo o estado RPC foi limpo. |
O cliente ou servidor chama push ou pull na ordem errada. | O tempo de execução retorna status de erro de preenchimento de pipe. |
O servidor chama push ou pull e a chamada falha. | Push retorna um código de falha. Nenhuma chamada para RpcAsyncCompleteCall é necessária. |
O servidor chama RpcAsyncCompleteCall antes que os pipes sejam drenados. | A chamada de pipe retorna um erro de preenchimento de pipe status. |
Após a expedição, uma operação de recebimento falha. | Na próxima vez que o servidor chamar pull para receber dados de pipe, um erro será retornado. |