[fpc-pascal] Raise exception in libray which will not halt host application

LacaK lacak at zoznam.sk
Thu Aug 26 12:59:44 CEST 2021



> Am 26.08.2021 um 10:10 schrieb LacaK via fpc-pascal:
>> Thank you for both answers!
>
> Please note that you won't be able to catch such an exception with the 
> type from within the application, e.g.:
>
> === code begin ===
>
> try
>   SomeLibraryFunction;
> except
>   on e: TMyObject do
>      Whatever;
>   else
>      WhateverElse;
> end;
>
> === code end ===
>
> The above code would go to the first branch *inside* your library, but 
> it will *always* go to the else-branch outside your library, cause the 
> comparison is done on the pointer to the VMT (the class type) which 
> will be *different* between library and application (even if you use 
> the same unit!). This is one of the main reasons why dynamic packages 
> are needed for comfortable use of libraries in Object Pascal, because 
> it allows such types to be shared across module boundaries.
>
My situation is even worser :-)
Library DLL is writen in Pascal, but main application is C/C#.
When I call in library RunError() then whole application aborts.
I need throw exception in library which can be catched in application.

I now use in unit which is used by library:

   if System.IsLibrary then
     raise TObject.Create // raise exception - type of exception is not 
important ...
     // can I call here also Windows's RaiseException()? ... so it will 
be propagated to linking application?
   else
     System.RunError(w);

L.



More information about the fpc-pascal mailing list