Thrift 异常抛出解决方案

场景

Thrift框架采用了异常处理机制,因此用户异常断开连接的情况下,当尝试发送数据给用户端的时候,Thrift库会抛出异常,导致进程中断。这种情况是非常正常的,服务器端应该捕获异常的发生,但是不应该异常退出。所以应该当前发送数据失败,直接返回

修改代码如下:

uint32_t TSocket::write_partial(const uint8_t* buf, uint32_t len) {

if (socket_ == -1) {

return -1;

throw TTransportException(TTransportException::NOT_OPEN, "Called write on non-open socket");

}

uint32_t sent = 0;

int flags = 0;

#ifdef MSG_NOSIGNAL

// Note the use of MSG_NOSIGNAL to suppress SIGPIPE errors, instead we

// check for the EPIPE return condition and close the socket in that case

flags |= MSG_NOSIGNAL;

#endif // ifdef MSG_NOSIGNAL

int b = send(socket_, const_cast_sockopt(buf + sent), len - sent, flags);

++g_socket_syscalls;

if (b < 0) {

if (errno == EWOULDBLOCK || errno == EAGAIN) {

return 0;

}

// Fail on a send error

int errno_copy = errno;

GlobalOutput.perror("TSocket::write_partial() send() " + getSocketInfo(), errno_copy);

if (errno_copy == EPIPE || errno_copy == ECONNRESET || errno_copy == ENOTCONN) {

//修改的第一个地方,直接返回-1,不抛出异常

close();

return -1;

//throw TTransportException(TTransportException::NOT_OPEN, "write() send()", errno_copy);

}

//修改的第二个地方,直接返回-1,不抛出异常

close();

return -1;

throw TTransportException(TTransportException::UNKNOWN, "write() send()", errno_copy);

}

// Fail on blocked send

if (b == 0) {

throw TTransportException(TTransportException::NOT_OPEN, "Socket send returned 0.");

}

return b;

}

原文地址:http://blog.51cto.com/fengyuzaitu/2071200

时间: 2024-10-17 00:14:36

Thrift 异常抛出解决方案的相关文章

Python之异常抛出机制

异常抛出机制 : 常见的Python异常:

PLSQL_Oracle Exception异常分类、异常抛出、异常处理、异常传播(概念)

2014-06-03 BaoXinjian 一.摘要 在PLSQL程序开发过程中,很重要的部分就是对程序异常的监控和处理,包括如何触发异常,何时进行处理,如何进行处理,是否将程式中的所有异常集中在一起,通过公共异常处理的procedure或function,如果没有完善的程式处理机制,很难说该程式是一只健壮的程式,当程式遇到很多类型或者量很多资料时,系统若没有异常处理必然会导致程式的出错 当预判到了某些异常,需要对预判到的异常进行合适相应的处理,是否抛出异常还是忽略还是其他 当然程式没有预判到或

swif-throws异常抛出

import UIKit enum VendingMachineError: Error { case invalidSelection //选择无效 case insufficientFunds(coinsNeeded: Int) //金额不足 case outOfStock //缺货 } struct Item { var price: Int var count: Int } class VendingMachine { var inventory = [ "Candy Bar"

C++中异常规格(异常抛出表)和 成员初始化表 的放置先后顺序

测试代码如下 #include <iostream> #include <cstdio> class CPoint{ public: CPoint(int x){ printf("has synax\n"); } CPoint(){ printf("no synax\n"); } }; class Point : public CPoint{ public: Point()throw() :CPoint(1){ } }; Point p; i

异常抛出与捕获的思考

异常处理的思考 在java中异常分为两类.一.检查性异常.二.非检查性异常(运行时异常) 二者的区别:检查性异常需要显式try-catch或者throw.运行时异常可以不用捕获. 对于检查性异常由于必须捕获,所有并不需要太多的讨论(在设计异常的时候需要考虑).主要讨论运行时异常的抛出与捕获. 运行时异常的正确捕获和抛出,能够让系统代码更加简洁与rd只需要关系正常业务,对于不正常业务则交由异常处理. 现在存在的困扰: 1.每调用一个其他方法,都需要考虑与分析这个方法是不是存在异常,影响正常业务流程

(转)spring异常抛出触发事务回滚策略

背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 测试用业务逻辑方法: /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exceptio

AspectJ的注解开发AOP:异常抛出通知的学习

异常抛出通知使用@AfterThrowing 在切面类中配置: import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import java.math.BigInteger; @Aspect public class aspectj { // @Before(value = "execution(* com.AspecJ.xiaomaoDao.*(..))") // publ

java中的异常抛出以及自定义异常

throw throws 声明将要抛出何种类型的异常(声明) public void 方法名(参数列表) throws 异常列表{ //调用会抛出异常的方法或者: throw new Exception(); } class 自定义异常类 extends异常类型{ }

关于异常抛出总结

throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常.对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型.如果异常的类型是Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中是不期待出现的. 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型.     throw总是出现在函数体中,用来抛出一个异常.程序会在throw语句后立即终止