Обработка ошибок (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 до очистки каналов. | Вызов канала возвращает состояние ошибки заполнения канала. |
После отправки операция получения завершается ошибкой. | При следующем вызове сервера для получения данных канала возвращается ошибка. |