From 571d1fab240aed6b53c198287bd3de37c49b1aae Mon Sep 17 00:00:00 2001 From: Nobuaki Sukegawa Date: Thu, 11 Feb 2016 07:06:21 +0900 Subject: [PATCH] THRIFT-3610 Streamline exception handling in Python server handler --- compiler/cpp/src/generate/t_py_generator.cc | 50 +++++++++++---------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/compiler/cpp/src/generate/t_py_generator.cc b/compiler/cpp/src/generate/t_py_generator.cc index 4ebbe894190..59ede05c7cd 100644 --- a/compiler/cpp/src/generate/t_py_generator.cc +++ b/compiler/cpp/src/generate/t_py_generator.cc @@ -1448,12 +1448,13 @@ void t_py_generator::generate_service_client(t_service* tservice) { const std::vector& xceptions = xs->get_members(); vector::const_iterator x_iter; for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - f_service_ << indent() << "if result." << (*x_iter)->get_name() << " is not None:" << endl; + const string& xname = (*x_iter)->get_name(); + f_service_ << indent() << "if result." << xname << " is not None:" << endl; if (gen_twisted_) { - f_service_ << indent() << indent_str() << "return d.errback(result." << (*x_iter)->get_name() << ")" + f_service_ << indent() << indent_str() << "return d.errback(result." << xname << ")" << endl; } else { - f_service_ << indent() << indent_str() << "raise result." << (*x_iter)->get_name() << "" << endl; + f_service_ << indent() << indent_str() << "raise result." << xname << "" << endl; } } @@ -1971,43 +1972,46 @@ void t_py_generator::generate_process_function(t_service* tservice, t_function* } f_service_ << ")" << endl; if (!tfunction->is_oneway()) { - f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl; + f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl; } indent_down(); f_service_ << indent() - << "except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):" << endl + << "except TTransport.TTransportException:" << endl << indent() << indent_str() << "raise" << endl; if (!tfunction->is_oneway()) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { - f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " - << (*x_iter)->get_name() << ":" << endl; - if (!tfunction->is_oneway()) { - indent_up(); - f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl; - f_service_ << indent() << "result." << (*x_iter)->get_name() << " = " - << (*x_iter)->get_name() << endl; - indent_down(); - } else { - f_service_ << indent() << "pass" << endl; - } + const string& xname = (*x_iter)->get_name(); + f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " << xname + << ":" << endl; + indent_up(); + f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl; + f_service_ << indent() << "result." << xname << " = " << xname << endl; + indent_down(); } - f_service_ << indent() << "except Exception as ex:" << endl + f_service_ << indent() << "except TApplicationException as ex:" << endl + << indent() << indent_str() + << "logging.exception('TApplication exception in handler')" << endl + << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl + << indent() << indent_str() << "result = ex" << endl + << indent() << "except Exception:" << endl + << indent() << indent_str() + << "logging.exception('Unexpected exception in handler')" << endl << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl - << indent() << indent_str() << "logging.exception(ex)" << endl - << indent() - << indent_str() << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, " - "'Internal error')" << endl + << indent() << indent_str() + << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, " + "'Internal error')" + << endl << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name() << "\", msg_type, seqid)" << endl << indent() << "result.write(oprot)" << endl << indent() << "oprot.writeMessageEnd()" << endl << indent() << "oprot.trans.flush()" << endl; } else { - f_service_ << indent() << "except:" << endl - << indent() << indent_str() << "pass" << endl; + f_service_ << indent() << "except Exception:" << endl + << indent() << indent_str() << "logging.exception('Exception in oneway handler')" << endl; } // Close function