[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