RPC(오류 처리)

동기 RPC에서 클라이언트는 성공 또는 실패 코드로 반환되는 원격 호출을 만듭니다. 비동기 RPC는 호출이 실패할 수 있는 더 많은 기회를 제공하며, 이러한 오류는 발생하는 위치와 시기에 따라 다르게 처리됩니다. 다음 표에서는 호출이 실패할 수 있는 방법 및 처리 방법에 대해 설명합니다.

클라이언트 쪽 정리

실패 증상 정리
클라이언트는 원격 프로시저를 호출할 때 예외를 catch합니다. RPC API 호출이 필요하지 않습니다. 모든 RPC 상태가 정리되었습니다.
클라이언트는 호출 전체 알림을 수신하지만 RpcAsyncCompleteCall을 호출하면 오류 코드가 수신됩니다. RPC API 호출이 필요하지 않습니다. 모든 RPC 상태가 정리되었습니다.
클라이언트는 중단이 아닌 취소 또는 중단 취소를 발급합니다. 클라이언트는 알림을 대기하고 알림이 도착하면 RpcAsyncCompleteCall 을 호출해야 합니다.

 

서버 쪽 정리에서 핵심 개념은 핸드오프 지점입니다. 비동기 호출을 서버 쪽에서 처리하는 동안 일반적으로 호출을 받은 스레드( 디스패처 스레드라고도 함)에서 일부 처리가 수행된 다음, 필요에 따라 디스패처 스레드는 메모리 블록에 충분한 상태를 두고 다른 스레드( 작업자 스레드라고도 함)에 신호를 보내 호출 처리를 계속합니다. 디스패처 스레드가 작업자 스레드를 핸드오프 지점이라고 하는 신호를 성공적으로 전달하는 순간입니다.

서버 쪽 정리

오류가 발생했습니다. 정리
핸드오프 지점 이전. 예외를 throw합니다. RpcAsyncCompleteCall에 대한 호출은 필요하지 않습니다.
핸드오프 지점 후. RpcAsyncAbortCall을 호출하거나 오류가 심각하지 않고 결과가 여전히 클라이언트인 RpcAsyncCompleteCall에 반환될 수 있는 경우 를 호출합니다. RpcAsyncCompleteCall 함수 호출이 실패하면 RPC 런타임에서 매개 변수를 해제합니다. 사용자는 해당 매개 변수에 액세스해서는 안됩니다. 디스패처 스레드는 더 이상 안전하게 호출을 중단할 수 없으므로 핸드오프 지점 이후에 실패할 수 있는 상당한 처리를 수행해서는 안 됩니다. 특히 핸드오프 지점 이후에 예외를 throw해서는 안 되며 서버가 충돌할 수 있습니다.

 

파이프에 대한 특수 오류 처리 사례

파이프를 사용할 때 오류 처리에 대한 특별한 경우가 있습니다. 다음 목록에서는 오류의 원인을 설명하고 오류를 처리하는 방법을 설명합니다.

오류의 원본 처리 방법
클라이언트는 푸시를 호출하고 호출이 실패합니다. RPC API 호출이 필요하지 않습니다. 모든 RPC 상태가 정리되었습니다.
클라이언트는 파이프의 가 드레이닝되기 전에 RpcAsyncCompleteCall을 호출합니다. 적절한 파이프 채우기 오류 코드로 인해 호출이 실패합니다.
클라이언트는 끌어오기를 호출하고 호출이 실패합니다. RPC API 호출이 필요하지 않습니다. 모든 RPC 상태가 정리되었습니다.
클라이언트 또는 서버가 잘못된 순서로 푸시 또는 끌어오기를 호출합니다. 런타임은 파이프 채우기 오류 상태 반환합니다.
서버는 푸시 또는 끌어오기를 호출하고 호출이 실패합니다. 푸시는 실패 코드를 반환합니다. RpcAsyncCompleteCall에 대한 호출은 필요하지 않습니다.
서버는 파이프가 드레이닝되기 전에 RpcAsyncCompleteCall 을 호출합니다. 파이프 호출은 파이프 채우기 오류 상태 반환합니다.
디스패치 후 수신 작업이 실패합니다. 다음에 서버가 끌어오기를 호출하여 파이프 데이터를 받을 때 오류가 반환됩니다.