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

Sven Barth pascaldragon at googlemail.com
Thu Aug 26 13:32:06 CEST 2021


Am 26.08.2021 um 12:59 schrieb LacaK via fpc-pascal:
>
>
>> 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#.

Then it will probably be caught as some external exception or such... 
don't know, never tried it.

> 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);

"raise" internally uses RaiseException on Windows. The only difference 
would be that you'd have a bit more control of exception code and such 
if you want to ensure that it's caught nicely by the C/C++/C# code.

Regards,
Sven


More information about the fpc-pascal mailing list