[ 
https://issues.apache.org/jira/browse/THRIFT-3191?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

James E. King, III updated THRIFT-3191:
---------------------------------------
    Summary: Perl compiler does not add support for unexpected exception 
handling  (was: Perl compiler does not add support for Thrift::TException 
handling)

> Perl compiler does not add support for unexpected exception handling
> --------------------------------------------------------------------
>
>                 Key: THRIFT-3191
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3191
>             Project: Thrift
>          Issue Type: Bug
>          Components: Perl - Compiler
>    Affects Versions: 0.9.2
>            Reporter: James E. King, III
>            Assignee: James E. King, III
>            Priority: Critical
>
> While adding "make cross" test server support for some other refactoring I 
> found that the generated code to handle testException exception responses 
> does not work properly.  The test says that the code can die with the 
> specified exceptions, but it can also die with Thrift::TException.
> The generated code that fails in ThriftTest.pm:
> {noformat}
> sub process_testException {
>     my ($self, $seqid, $input, $output) = @_;
>     my $args = new ThriftTest::ThriftTest_testException_args();
>     $args->read($input);
>     $input->readMessageEnd();
>     my $result = new ThriftTest::ThriftTest_testException_result();
>     eval {
>       $self->{handler}->testException($args->arg);
>     }; if( UNIVERSAL::isa($@,'ThriftTest::Xception') ){ 
>       $result->{err1} = $@;
>     }
>     $output->writeMessageBegin('testException', TMessageType::REPLY, $seqid);
>     $result->write($output);
>     $output->writeMessageEnd();
>     $output->getTransport()->flush();
> }
> {noformat}
> If the resulting implementation dies with a {{new 
> Thrift::TException("foo")}}, the C++ client side gets a void back.
> Code that allows the test to pass adds support for capturing TException:
> {noformat}
>     eval {
>       $self->{handler}->testException($args->arg);
>     }; if( UNIVERSAL::isa($@,'ThriftTest::Xception') ){ 
>       $result->{err1} = $@;
>     }; if( UNIVERSAL::isa($@,'Thrift::TException') ){ 
>       $result->{err1} = $@;
>     }
> }
> {noformat}
> Adding this to the compiler output is reasonable, however what the generated 
> code is doing when an exception of another type is thrown seems quite wrong.  
> It simply ignores the exception and returns an empty reply.  I think it would 
> make more sense here to catch all not-specifically generated exceptions and 
> make a TException that describes what happened, but let the server continue 
> processing.  This would be a programming error on the server handler 
> implementation.
> We end up with:
> {noformat}
>     eval {
>       $self->{handler}->testException($args->arg);
>     }; if( UNIVERSAL::isa($@,'ThriftTest::Xception') ){ 
>       $result->{err1} = $@;
>     } elsif (defined $@) {
>       $result->{err1} = new Thrift::TException("Unexpected exception: ".$@);
>     }
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to