Обработка ошибок (RPC)

В синхронном RPC клиент выполняет удаленный вызов, возвращающий код успешного или неудачного выполнения. Асинхронный RPC предоставляет больше возможностей для сбоя вызова, и эти сбои обрабатываются по-разному в зависимости от того, где и когда они происходят. В следующей таблице описаны способы сбоя вызова и способы его обработки.

Очистка на стороне клиента

Симптом сбоя Очистка
Клиент перехватывает исключение при вызове удаленной процедуры. Вызовы API RPC не нужны. Все состояние RPC было очищено.
Клиент получает уведомление о завершении вызова, но при вызове RpcAsyncCompleteCall он получает код ошибки. Вызовы API RPC не нужны. Все состояние RPC было очищено.
Клиент не прерывает или прерывает отмену. Клиент должен дождаться уведомления и вызвать RpcAsyncCompleteCall при поступлении уведомления.

 

При очистке на стороне сервера ключевой концепцией является точка передачи. Во время обработки асинхронного вызова на стороне сервера некоторые обработки обычно выполняются в потоке, который получил вызов (также известный как поток диспетчера), а затем при необходимости поток диспетчера помещает достаточное состояние в блок памяти и передает сигнал другому потоку (также известному как рабочий поток), чтобы продолжить обработку вызова. Момент, когда поток диспетчера успешно сообщает о том, что рабочий поток называется точкой передачи.

Очистка на стороне сервера

Ошибка Очистка
До передачи точки. Создайте исключение. Вызов RpcAsyncCompleteCall не требуется.
После передачи точки. Вызовите RpcAsyncAbortCall или, если ошибка не является неустранимой и результаты по-прежнему могут быть возвращены клиенту, RpcAsyncCompleteCall. Если вызов функции RpcAsyncCompleteCall завершается сбоем, среда выполнения RPC освобождает параметры. Пользователь не должен получать доступ к этим параметрам. Поток диспетчера не должен выполнять существенную обработку, которая может завершиться сбоем после точки передачи, так как он больше не может безопасно прервать вызов. В частности, он не должен вызывать исключение после точки выключения руки, иначе сервер может завершить работу.

 

Специальные случаи обработки ошибок для каналов

Существуют особые случаи для обработки ошибок при использовании каналов. В следующем списке объясняется источник сбоя и способы обработки ошибки.

Источник сбоя Как обрабатывается
Клиент вызывает push, и вызов завершается сбоем. Вызовы API RPC не нужны. Все состояние RPC было очищено.
Клиент вызывает RpcAsyncCompleteCall перед очисткой каналов in . Вызов завершается сбоем с соответствующим кодом ошибки заполнения канала.
Клиент вызывает запрос по запросу, и вызов завершается ошибкой. Вызовы API RPC не нужны. Все состояние RPC было очищено.
Клиент или сервер вызывает push или pull в неправильном порядке. Во время выполнения возвращается состояние ошибки заполнения канала.
Сервер вызывает push или pull, и вызов завершается ошибкой. Push возвращает код сбоя. Вызов RpcAsyncCompleteCall не требуется.
Сервер вызывает RpcAsyncCompleteCall перед очисткой каналов. Вызов канала возвращает состояние ошибки заполнения канала.
После отправки операция получения завершается сбоем. При следующем вызове сервера pull для получения данных канала возвращается ошибка.