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

LacaK lacak at zoznam.sk
Thu Aug 26 13:39:36 CEST 2021



>>> 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.
*“System.Runtime.InteropServices.SEHException (0x80004005): External 
component has thrown an exception.”*

>
>> 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 . 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.

Ok, then if raise TObject.Create; calls RaiseException then I think that 
I will use raise TObject.Create;
Thanks
L.*
*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20210826/01c576a0/attachment.htm>


More information about the fpc-pascal mailing list