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