欢迎访问宙启技术站
智能推送

Thrift.Thrift.TApplicationExceptionUNKNOWN_METHOD:未知方法导致的错误处理

发布时间:2023-12-19 01:41:46

TApplicationException是Thrift中的异常类,用于表示客户端调用了服务端未知的方法。

在Thrift中,客户端和服务端需要使用相同的接口定义文件(.thrift文件)来生成对应的代码。如果客户端调用了服务端未定义的方法,或者客户端和服务端的接口定义不一致,就会导致TApplicationExceptionUNKNOWN_METHOD异常。

以下是一个简单的使用例子,展示了如何处理TApplicationExceptionUNKNOWN_METHOD异常。

1. 首先,在服务端定义一个接口,包含已知的方法:

namespace java com.example

service MyService {
    string sayHello(1: string name),
    i32 addNumbers(1: i32 x, 2: i32 y),
}

2. 使用thrift编译器生成对应的服务端和客户端代码。假设生成的代码目录分别是gen-javagen-py

3. 在服务端实现接口,并启动Thrift服务:

from gen-py.example import MyService
from thrift.transport import TSocket, TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

class MyHandler:
    def sayHello(self, name):
        return "Hello " + name

    def addNumbers(self, x, y):
        return x + y

handler = MyHandler()
processor = MyService.Processor(handler)
transport = TSocket.TServerSocket("localhost", 9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
server.serve()

4. 在客户端调用已知的方法:

import com.example.MyService;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

public class MyClient {
    public static void main(String[] args) {
        TTransport transport = new TSocket("localhost", 9090);
        try {
            transport.open();
            TProtocol protocol = new TBinaryProtocol(transport);
            MyService.Client client = new MyService.Client(protocol);
            String result = client.sayHello("Thrift");
            System.out.println(result);
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            transport.close();
        }
    }
}

5. 运行客户端代码,查看输出:

Hello Thrift

6. 修改客户端代码,调用未知的方法:

String result = client.unknownMethod("Thrift");
System.out.println(result);

7. 运行客户端代码,会抛出TApplicationExceptionUNKNOWN_METHOD异常,可以在catch块中处理异常并输出错误信息:

catch (TApplicationException e) {
    System.out.println("调用未知方法:" + e.getMessage());
    e.printStackTrace();
}

8. 再次运行客户端代码,会输出如下错误信息:

调用未知方法:Unknown method: unknownMethod

通过以上例子,可见TApplicationExceptionUNKNOWN_METHOD异常是由客户端调用了服务端未知方法引起的。在异常处理中,我们可以根据异常的类型进行相应的处理,比如输出错误信息或者进行重试等。