尝试更多地了解RPC以回答作业问题:异常是否以相同的方式处理来电者?是否在服务器上引发异常的细节是否有所不同?如果你需要重新抛出,是否还有其他差异?
或者,有人可以解释本地和远程异常之间的主要区别吗?如果我想实现远程异常,也许可以了解需要注意的事项。
答案 0 :(得分:0)
这是RPC服务器/客户端库的简单版本:
Server:
try
receive message
deserialize arguments
invoke appropriate method
serialize result
transmit result
catch any Exeption
serialize Exception
transmit Exception
Client (Library code, not the caller):
try
serialize arguments
make remote call
receive "something"
deserialize "something" (could be serialized exception or result)
catch Timeout,Network,Other exceptions not from server
handle whatever the library handles
if deserialized "something" is an exception
rethrow exception from server for caller to catch
else, good/expected results
return results
因此,如果您希望调用者捕获异常,则它们可能与常规异常不同,因为它们必须序列化并通过网络传输以便为调用者重新抛出。
如果客户端库存在,调用者不需要做任何特殊操作。如果客户端库不存在,则调用者还需要担任客户端库的角色。这意味着调用者需要区分序列化结果和序列化异常(此时程序员可能会实现客户端库代码的ad-hoc版本,以避免使用丑陋的调用者代码)。
显然,你不能只使用类型签名来区分异常和结果(否则,如果RPC方法的返回类型和异常类型相同,会发生什么?)。因此,服务器的序列化代码中会有一点点开销来标记不同的响应。