2013-02-22 40 views
2

我正在使用Thrift服务器,它基本上只是一个围绕斯坦福分析器的封装(尽管这不是太重要)。有时候,斯坦福分析师会根据所给出的输入来抛出有用的例外;例如,如果输入太长(根据解析器),生成输入的用户应该会收到此异常,以便他们可以决定如何处理它。但是,我似乎无法让Thrift通过此异常,而只向客户端返回Apache 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()内容不被发送到客户端。我如何才能获得斯坦福分析器抛出的异常情况,并由Thrift向客户抛出异常?

+1

在你的节俭清单中,你是否认为该方法可以抛出一些例外? – darkheir 2013-02-27 08:37:13

+1

我会推荐这个相关问题的答案:http://stackoverflow.com/questions/11755292/how-to-use-java-built-in-exception-in-thrift-idl – dhal 2013-02-27 20:02:16

+0

有趣的...我见过这个问题已经出现了,但我并不认为这就是我所期待的。也许是。而@darkheir,是的,但我也尝试过这个声明,没有任何区别。 :/ – dmn 2013-02-28 19:28:27

回答

0

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

这是因为节俭框架包裹像这样(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给予任何消息,都会被忽略和节俭的框架所取代。