egametang/ET · error · RpcException

Message: {response.Message} Request: {requestType.FullName}

Error message

Message: {response.Message} Request: {requestType.FullName}

What it means

In CallInner, after the switch cases for ERR_NotFoundActor and ERR_MessageTimeout, the response carried an error code that IsRpcNeedThrowException flags as needing to throw — any non-zero error below ERR_WithoutException (200000000). This is the catch-all for unhandled hard RPC errors. The RpcException wraps the server's error code, response.Message, and the request type full name.

Source

Thrown at Packages/cn.etetet.actorlocation/Scripts/Hotfix/Server/MessageLocationSenderComponentSystem.cs:314

                        await root.TimerComponent.WaitAsync(failTimes * failTimes * 10);
                        messageLocationSender = messageLocationSenderRef;
                        if (messageLocationSender == null)
                        {
                            throw new RpcException(ErrorCode.ERR_ActorLocationSenderTimeout4, $"{requestType.FullName}");
                        }

                        messageLocationSender.ActorId = default;
                        continue;
                    }
                    case ErrorCode.ERR_MessageTimeout:
                    {
                        throw new RpcException(response.Error, $"{requestType.FullName}");
                    }
                }

                if (ErrorCode.IsRpcNeedThrowException(response.Error))
                {
                    throw new RpcException(response.Error, $"Message: {response.Message} Request: {requestType.FullName}");
                }

                return response;
            }
        }
    }

    [EntitySystemOf(typeof(MessageLocationSenderComponent))]
    public static partial class MessageLocationSenderManagerComponentSystem
    {
        [EntitySystem]
        private static void Awake(this MessageLocationSenderComponent self)
        {
        }
        
        public static MessageLocationSenderOneType Get(this MessageLocationSenderComponent self, int locationType)
        {
            MessageLocationSenderOneType messageLocationSenderOneType = self.GetChild<MessageLocationSenderOneType>(locationType);

View on GitHub (pinned to 5cab01f7a8)

Solutions

  1. Inspect response.Error (accessible via RpcException.Error property) and response.Message in the exception to identify the specific failure.
  2. Fix the root cause on the target actor side — check its logs for the originating exception.
  3. Catch RpcException and handle the specific error code at the application level.
  4. Verify caller and target run compatible code versions with matching error code definitions.
Defensive patterns

Strategy: try-catch

Try / catch

try
{
    IResponse resp = await senderOneType.Call(entityId, iLocationRequest);
}
catch (RpcException e)
{
    // Inspect e.Error to determine the specific failure
    Log.Error($"RPC failed: error={e.Error} msg={e.Message}");
    if (e.Error == ErrorCode.ERR_RpcFail)
    {
        // target-side exception — check target logs
    }
    throw;
}

Prevention

When it happens

Trigger: Call(entityId, iLocationRequest) where the target actor returns any error code in the ERR_WithException range (100000000–200000000) that isn't ERR_NotFoundActor or ERR_MessageTimeout — e.g., ERR_RpcFail, ERR_SessionSendOrRecvTimeout, or application-specific hard errors.

Common situations: Application logic on the target actor threw an exception that surfaced as a hard RPC error. Version mismatch introducing new error codes in the 100M range. Session or connection errors during the RPC. Target actor rejected the request with a hard error.

Related errors


AI-assisted analysis of egametang/ET@5cab01f7a8 (2026-08-13). Data as JSON: /api/errors/842ce34f439bc1f3. Report an issue: GitHub.