【Thrift】自定义异常

本文介绍如何在Thrift中自定义异常,并在服务端与客户端间正确传递异常信息,确保客户端能捕获并处理服务端抛出的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

thrift 0.9.3版本。

 

thrift文件可以自定义异常,在服务里声明。这样,服务端抛出异常,客户端才可以捕获,如果是未声明的,则客户端无法识别,就无法正确反序列化出返回的内容,导致协议层抛出异常。

model.thrift:

namespace java com.liyao.model

struct Person{
    1: required string name;
    2: optional i32 age;
}

exception MyException{
    1: optional i32 code;
    2: optional string msg;
}

hello.service:

namespace java com.liyao.service

include "model.thrift"

service  HelloWorldService {
  string sayHello(1: model.Person person) throws (1: model.MyException e)
}

使用thrift -r --gen java hello.thrift 编译。

实现类:

public class HelloWorldServiceImpl implements HelloWorldService.Iface {

    @Override
    public String sayHello(Person person) throws MyException, TException {
        if (person.age < 10) {
            MyException e = new MyException();
            e.setCode(500);
            e.setMsg("age too small");
            throw e;
        } else if (person.age > 100) {
            throw new NullPointerException();
        }
        return "hello " + person.name;
    }
}

服务端,使用simple模式:

public class HelloServerDemo {
    public static void main(String args[]){
        try {
            System.out.println("服务端开启....");
            TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldServiceImpl());
            TServerSocket serverTransport = new TServerSocket(50004);
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            TServer server = new TSimpleServer(tArgs);
            server.serve();
        }catch (TTransportException e) {
            e.printStackTrace();
        }
//        try {
//            System.out.println("服务端开启....");
//            TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldServiceImpl());
//            TNonblockingServerTransport serverSocket=new TNonblockingServerSocket(50004);
//            TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverSocket);
//            tArgs.processor(tprocessor);
//            tArgs.protocolFactory(new TBinaryProtocol.Factory());
//            TServer server = new TThreadedSelectorServer(tArgs);
//            server.serve();
//        }catch (TTransportException e) {
//            e.printStackTrace();
//        }
    }

}

客户端:

public class Client {

    public static void main(String[] args) {
        System.out.println("客户端启动....");
        TTransport transport = null;
        try {
            transport = new TSocket("localhost", 50004);
            TProtocol protocol = new TBinaryProtocol(transport);
            HelloWorldService.Client client = new HelloWorldService.Client(protocol);
            transport.open();

            Person p = new Person();
            p.setName("ly");
            p.setAge(400);
            String result = client.sayHello(p);
            System.out.println(result);
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }
    }
}

如果是NPE,则客户端:

客户端启动....
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused: connect
    at org.apache.thrift.transport.TSocket.open(TSocket.java:226)
    at com.liyao.Client.main(Client.java:21)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.apache.thrift.transport.TSocket.open(TSocket.java:221)
    ... 1 more

Process finished with exit code 0
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值