2

我正在开发一个 Thrift 服务器,它基本上只是斯坦福解析器的一个包装器(尽管这不是太重要)。有时,Stanford Parser 会根据给出的输入抛出有用的异常;例如,如果输入太长(根据解析器),生成输入的用户应该收到这个异常,以便他们决定如何处理它。但是,我似乎无法让 Thrift 传递这个异常,而是只返回

Internal error processing <name of Thrift method being called>

给客户。

我在该方法中有以下代码:

try
{
    // a whole bunch of Stanford Parser stuff
}
catch (Exception e)
{
    throw new TApplicationException(TApplicationException.INTERNAL_ERROR, e.getMessage());
}

并且该方法确实会抛出 a TApplicationException,但无论是什么内容e.getMessage()都不会发送给客户端。如何让斯坦福解析器抛出的异常由 Thrift 抛出给客户端?

4

1 回答 1

0

恐怕您必须定义自己的异常,而不是使用 TException 或其任何子类。

那是因为 Thrift 框架像这样包装你的代码(ProcessFunction.java):

try {
  result = getResult(iface, args);
} catch(TException tex) {
  LOGGER.error("Internal error processing " + getMethodName(), tex);
  TApplicationException x = new TApplicationException(TApplicationException.INTERNAL_ERROR, 
    "Internal error processing " + getMethodName());
  oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid));
  x.write(oprot);
  oprot.writeMessageEnd();
  oprot.getTransport().flush();
  return;
}

因此,您在 TException 中给出的任何消息都将被 Thrift 框架忽略并替换。

于 2015-06-19T07:48:17.197 回答