2

私は、基本的にスタンフォードパーサーの単なるラッパーであるThriftサーバーに取り組んでいます(それはそれほど重要ではありませんが)。スタンフォードパーサーは、与えられた入力に応じて、有用な例外をスローすることがあります。たとえば、入力が長すぎる場合(パーサーによると)、入力を生成するユーザーはこの例外を受け取り、処理方法を決定できるようにする必要があります。ただし、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());
}

メソッドはをスローしますTApplicationExceptionが、その内容がe.getMessage()クライアントに送信されていません。スタンフォードパーサーによってスローされた例外を、スリフトによってクライアントにスローされるようにするにはどうすればよいですか?

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 に答える