[ 
https://issues.apache.org/jira/browse/THRIFT-5837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17900533#comment-17900533
 ] 

Jens Geyer edited comment on THRIFT-5837 at 11/23/24 12:23 AM:
---------------------------------------------------------------

The new design has completely changed internally:
 * the exception factory is gone
 * the exception data are held in a dedicated data instance (a simple 
straightforward Thrift struct) and no longer in the exception class itself
 * that struct is also used when the exception data are used as a simpe struct

 

This Thrift IDL
{code:java}
exception Error {
  1: i32 ErrorCode
  2: Error InnerException
}
{code}
produces three classes/interfaces:
{code:java}
// exception data as struct
IError = interface(IBase)  .... end;

// the data class that implements IError and holds all data
TErrorImpl = class(TInterfacedObject, IBase, ..., IError)   .... end;

// the exception class is only used when the exception is really used as such, 
i.e. thrown and caught.
TError = class(TException, IInterface, IBase, ISupportsToString)  .... end;
{code}
 

The exception class {{TError}} offers this public API
{code:java}
  TError = class(TException, IInterface, IBase, ISupportsToString)
  public
    constructor Create; overload;
    constructor Create( aErrorCode: System.Integer; const aInnerException: 
IError); overload;
    constructor Create( const aData: IError); overload;
    destructor Destroy; override;

    property ExceptionData : IError read FData;
    function ToString: string; override;

    // IBase
    procedure Read( const iprot: IProtocol);
    procedure Write( const oprot: IProtocol);

    // Properties
    property ErrorCode: System.Integer read GetErrorCode write SetErrorCode;
    property InnerException_: IError read GetInnerException write 
SetInnerException_;

    // isset -> omitted for brevity
  end;{code}
{*}NOTE{*}: Despite implementing interfaces, {{TError}} still inherits from 
{{Exception}} and therefore still and *very deliberately* is not refcounted. 
Making an {{Exception}} descendant refcounted would cause all kinds of subtle 
issues (invalid ptrs, memory leaks - you name it) because it interferes with 
the Delpjhi "compiler magic" special logic around exception handling.


was (Author: jensg):
The new design is comnpletely changed internally:
 * the exception factory is gone
 * the exception data are held in a dedicated data instance (a simple 
straightforward Thrift struct) and no longer in the exception class itself
 * that struct is also used when the exception data are used as a simpe struct

 

This Thrift IDL
{code:java}
exception Error {
  1: i32 ErrorCode
  2: Error InnerException
}
{code}
produces three classes/interfaces:
{code:java}
// exception data as struct
IError = interface(IBase)  .... end;

// the data class that implements IError and holds all data
TErrorImpl = class(TInterfacedObject, IBase, ..., IError)   .... end;

// the exception class is only used when the exception is really used as such, 
i.e. thrown and caught.
TError = class(TException, IInterface, IBase, ISupportsToString)  .... end;
{code}
 

The exception class {{TError}} offers this public API
{code:java}
  TError = class(TException, IInterface, IBase, ISupportsToString)
  public
    constructor Create; overload;
    constructor Create( aErrorCode: System.Integer; const aInnerException: 
IError); overload;
    constructor Create( const aData: IError); overload;
    destructor Destroy; override;

    property ExceptionData : IError read FData;
    function ToString: string; override;

    // IBase
    procedure Read( const iprot: IProtocol);
    procedure Write( const oprot: IProtocol);

    // Properties
    property ErrorCode: System.Integer read GetErrorCode write SetErrorCode;
    property InnerException_: IError read GetInnerException write 
SetInnerException_;

    // isset -> omitted for brevity
  end;{code}
{*}NOTE{*}: Despite implementing interfaces, {{TError}} still inherits from 
{{Exception}} and therefore still and *very deliberately* is not refcounted. 
Making an {{Exception}} descendant refcounted would cause all kinds of subtle 
issues (invalid ptrs, memory leaks - you name it) because it interferes with 
the Delpjhi "compiler magic" special logic around exception handling.

> Delphi implementation for THRIFT-5835
> -------------------------------------
>
>                 Key: THRIFT-5837
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5837
>             Project: Thrift
>          Issue Type: Sub-task
>          Components: Delphi - Compiler
>            Reporter: Jens Geyer
>            Assignee: Jens Geyer
>            Priority: Major
>
> *Premise*: Rewrite entire exception code internally to implement THRIFT-5835 
> but don't break existing code.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to