Поделиться через


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

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

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

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

 

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

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

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

 

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

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

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