RPC的例外是否与普通例外相同?

时间:2012-02-04 17:57:08

标签: distributed-computing

尝试更多地了解RPC以回答作业问题:异常是否以相同的方式处理来电者?是否在服务器上引发异常的细节是否有所不同?如果你需要重新抛出,是否还有其他差异?

或者,有人可以解释本地和远程异常之间的主要区别吗?如果我想实现远程异常,也许可以了解需要注意的事项。

1 个答案:

答案 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方法的返回类型和异常类型相同,会发生什么?)。因此,服务器的序列化代码中会有一点点开销来标记不同的响应。