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

Jens Geyer resolved THRIFT-4562.
--------------------------------
       Resolution: Fixed
         Assignee: Jens Geyer
    Fix Version/s: 0.12.0

Committed.

> Calling wrong exception CTOR leads to "call failed: unknown result" instead 
> of the real exception being thrown
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-4562
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4562
>             Project: Thrift
>          Issue Type: Bug
>          Components: Delphi - Compiler
>            Reporter: Jens Geyer
>            Assignee: Jens Geyer
>            Priority: Major
>             Fix For: 0.12.0
>
>
> h2. Problem
> # In contrast to other languages, there is no real way to prevent Delphi from 
> inheriting unwanted CTORs.
>  # The generated code initializes an "exception factory" helper object used 
> for serializing the exception info over the wire. This helper object is 
> instantiated in two cases:
>  ** a) in the CTORs that are defined in the exception class
>  ** b) when a property setter is called on that instance
> h2. Example
> The following IDL:
> {code:java}
> exception ApiException {
>  1: string     Msg
>  2: i32  Error
> }
> {code}
> results in this Delphi code:
> {code:java}
> TApiException = class(TException)
> // ... some unrelevant details omitted ...
> public
>   constructor Create; overload;
>   constructor Create( const AMsg: System.string; AError: System.Integer); 
> overload;
>   // ... more code ...
> end; 
> {code}
> Due to the inheritance from {{TException}} and finally {{System.Exception}}, 
> a bunch of other CTORs is inherited, such as:
> {code:java}
>   constructor Create(const Msg: string);
> {code}
> From this, a situation may arise, in which the developer instantiates the 
> instance by calling one of the inherited CTORs (which do not intialize the 
> Factory helper object), then raising the exception without assigning any 
> other values via property setter:
> {code}
> raise TApiException.Create('some error occurred!');  // inherited CTOR
> {code}
> instead of 
> {code}
> raise TApiException.Create('some error occurred!', 42);  // TApiException  
> CTOR
> {code}
> Under these circumstances, the Factory helper object is left at its default 
> value of {{nil}}, hence no suitable information is written to the wire. As a 
> direct result, being unable to deserialize anything useful on return, the 
> client code will run into the default catcher code which raises an generic 
> TApplicationException with {{MissingResult}} code and the "call failed: 
> unknown result" message.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to