【Thrift】自定义异常

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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Node.js 中使用 Thrift 进行开发时,异常处理是非常重要的一部分。下面是一些基于 Thrift 的 Node.js 异常处理的技巧: 1. 在客户端和服务器端都需要处理异常。在客户端,您可以使用 try-catch 块来捕获 Thrift 调用中的异常。在服务器端,您可以为每个服务实现设置错误处理程序来捕获异常。您可以使用以下代码在服务器端设置异常处理程序: ``` var myServiceHandler = { myMethod: function (params, result) { try { // Service implementation } catch (e) { // Handle errors result(new thrift.TApplicationException(thrift.TApplicationException.INTERNAL_ERROR, "Internal error")); } } }; var processor = new thrift.Processor(myServiceHandler); ``` 2. 在客户端和服务器端都应该使用 TApplicationException 类处理异常。TApplicationException 类可用于传递错误消息和错误代码。在客户端,您可以使用此类来获取有关远程服务调用的错误信息。在服务器端,您可以使用此类来向客户端传递错误信息。 3. 在 Thrift 调用中,您可以使用 Promise 或回调函数来处理异步调用。在使用 Promise 时,您可以使用 then() 和 catch() 方法来处理成功和失败的情况。在使用回调函数时,您可以在回调函数中处理异常。以下是使用 Promise 处理异常的示例代码: ``` var client = new myServiceClient(connection); client.myMethod(params) .then(function (result) { // Handle success }) .catch(function (error) { // Handle error }); ``` 4. 最后,建议使用日志记录库来记录异常信息。这将有助于您诊断问题并了解哪些异常最频繁发生。 希望以上技巧能够帮助您在 Node.js 中正确处理 Thrift 异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值