[fpc-pascal] Strange syntax in raising exceptions
Paul Ishenin
webpirat at mail.ru
Thu Jul 16 00:40:29 CEST 2009
Graeme Geldenhuys wrote:
> Hi,
>
> While porting DUnit2 to Free Pascal I came across the following code.
> I have never seen syntax like that, yet it is accepted by FPC and
> Delphi compilers.
>
> Is this documented in FPC docs? What does the '... at
> <some_function_returning_a_pointer>' do?
>
> Unfortunately I don't have any docs (fpc, delphi or kylix) available
> here on my home pc, but I'll try and look for tips tomorrow at work.
> In somebody else could give some insight it would be much appreciated.
>
> =======================================
> procedure TTestProc.Warn(const ErrorMsg: string; const ErrorAddress:
> Pointer);
> begin
> if ErrorAddress = nil then
> raise EPostTestFailure.Create(ErrorMsg) at CallerAddr
> else
> raise EPostTestFailure.Create(ErrorMsg) at ErrorAddress;
> end;
Usually you place raise ESomeException.Create() to paticular place where
it happen. Therefore in IDE or in your application you will see error
message with address of function where exception was raised.
But if you place raise ESomeException.Create() to some special function
which only raises it like your Warn fiunction then address of exception
will be useless. Who wants to know that it was raised in Warn function?
Better to assign a caller address to that exception. For this we have
'at' keyword.
You can replace this code:
if ErrorAddress = nil then
raise EPostTestFailure.Create(ErrorMsg) at CallerAddr
by next magic functions in fpc:
if ErrorAddress = nil then
raise EPostTestFailure.Create(ErrorMsg) at get_caller_addr(get_frame)
Best regards,
Paul Ishenin.
More information about the fpc-pascal
mailing list